|   |   | 
| 
 | Регулярные выражения в v82 | ☑ | ||
|---|---|---|---|---|
| 0
    
        orefkov 09.04.13✎ 01:25 | 
        Представляю свою ВК для работы с регулярными выражениями в v82.
  Для работы используется движок регулярных выражений, который идет с 1С - ICU. Более мощные и правильные, чем VBScript.Regexp, всегда под рукой. Поддерживается replace и split. Работает пока только под Win. Толстый, тонкий клиент, сервер 32 и 64 бит. Релизы поддерживаются с 8.2.14. 8.3 по идее тоже должно работать, но не проверял. Скачать - http://snegopat.ru/downloads/rex-v8.zip Описание внутри и на http://snegopat.ru/forum/viewtopic.php?f=5&t=444 В планах - linux версии. | |||
| 1
    
        a_alenkin 09.04.13✎ 01:46 | 
        а чо такое регулярные выражения и нужно ли это нам?     | |||
| 2
    
        Armando 09.04.13✎ 01:58 | 
        Спасибо! Иногда этого не хватает     | |||
| 3
    
        orefkov 09.04.13✎ 01:58 | 
        (1)
  Вам - не знаю. Но знаю тех, кому нужно. И мне кстати в первую очередь. | |||
| 4
    
        Ursus maritimus 09.04.13✎ 03:39 | 
        (0) А чем конкретно "Более мощные и правильные"?     | |||
| 5
    
        orefkov 09.04.13✎ 08:09 | 
        (4)
  Поддерживают Look-behind. Поддерживают поиск по unicode-свойствам, например: [\p{Letter}&&\p{script=cyrillic}] - все кириллические буквы [\p{Letter}--\p{script=latin}]- все не латинские буквы Поддерживают комментарии в выражении. | |||
| 6
    
        orefkov 09.04.13✎ 09:11 | 
        Проверил на 8.3
  Тоже работает. | |||
| 7
    
        МихаилМ 09.04.13✎ 09:15 | 
        спасибо.     | |||
| 8
    
        Feunoir 09.04.13✎ 09:18 | 
        (0) Спасибо, может и понадобится когда-нибудь.     | |||
| 9
    
        mzelensky 09.04.13✎ 09:21 | 
        (0) + респект :)     | |||
| 10
    
        mzelensky 09.04.13✎ 09:22 | 
        еще бы инструкцию нормальную с примерами по правилам написания этих самых выражений.     | |||
| 11
    
        orefkov 09.04.13✎ 12:09 | 
        (10)
  Даже не знаю, хотел было статью написать, да времени нет. В снегопате проще, там Кунташов редактор регулярных выражений сделал, надо бы и для Предприятия сделать, да все никак. | |||
| 12
    
        TormozIT гуру 09.04.13✎ 12:13 | 
        А где публикация на инфострате, чтобы будущие поколения не потеряли и плюсануть то?)     | |||
| 13
    
        vhl 09.04.13✎ 12:22 | 
        (5) Короче остаемся на VBScript.Regexp.     | |||
| 14
    
        TormozIT гуру 09.04.13✎ 12:28 | 
        Может быть есть выигрыш по скорости?
  А обход коллекции поддерживается (Для Каждого)? | |||
| 15
    
        orefkov 09.04.13✎ 12:33 | 
        (13)
  Ну, я бы для начала попробовал таки скорость померять... (12) Думаешь, надо? | |||
| 16
    
        orefkov 09.04.13✎ 12:34 | 
        (14)
  Нет, поддерживается Пока выражение.Найти() split - массив возвращает сразу. | |||
| 17
    
        SachoZ 09.04.13✎ 12:42 | 
        (0) спасибо, иногда очень нужная штука!     | |||
| 18
    
        orefkov 09.04.13✎ 12:42 | 
        Хотя можно переделать интерфейс.
  Убрать свойство "Строка", сделать текст передаваемый сразу в методы Совпадает, Начинается, Найти. Возвращать сразу весь результат в виде массивов. | |||
| 19
    
        SachoZ 09.04.13✎ 12:56 | 
        по скорости работы сравнивали с VBScript.Regexp?     | |||
| 20
    
        orefkov 09.04.13✎ 13:08 | 
        (19)
  Вот сейчас сравнил. Тест на выделение из строки всех цифровых вхождений с укладкой их в массив: &НаКлиенте Процедура ТестированиеVB(текст) результат = Новый Массив; ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ре.Pattern = "\d+"; Для К = 1 По 10 Цикл м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ТестированиеV8(текст) результат = Новый Массив; ре = Новый("V8RegEx"); ре.Шаблон = "\d+"; Для К = 1 По 10 Цикл ре.Строка = текст; Пока ре.Найти() Цикл результат.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) текст = "луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999"; т1 = ТекущаяДата(); Для Номер = 1 По 10000 Цикл ТестированиеVB(текст); КонецЦикла; т2 = ТекущаяДата(); Для Номер = 1 По 10000 Цикл ТестированиеV8(текст); КонецЦикла; т3 = ТекущаяДата(); Сообщить("Время VB=" + (т2 - т1) + " Время V8=" + (т3 - т2)); КонецПроцедуры Время VB=5 Время V8=1 | |||
| 21
    
        vhl 09.04.13✎ 14:06 | 
        (20) А если поменять местами функции ТестированиеVB и ТестированиеV8 :)     | |||
| 22
    
        orefkov 09.04.13✎ 14:34 | 
        (21)
  "Время V8=2 Время VB=5" Маловата точность такого замера... | |||
| 23
    
        orefkov 09.04.13✎ 14:36 | 
        Да и так ясно, что мой быстрее будет, чем VB. Для моей ВК не делается преобразование в COM и обратно, все напрямую работает.     | |||
| 24
    
        TormozIT гуру 09.04.13✎ 14:40 | 
        Пока форум не работал, запостил в форум снегопата https://snegopat.ru/forum/viewtopic.php?f=6&t=447&p=5194#p5194
  Дублирую сюда Провел строгие замеры выполнения кода на клиенте (32b версия ВК) в консоли кода (ИР), в которой есть специальные функции для проведения сравнительных замеров с контролем отключенности отладчика. Код: ПодключитьВнешнююКомпоненту("D:\Program Files\1cv82\common\rex32.dll", "V8RegEx", ТипВнешнейКомпоненты.Native); текст = "луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999"; Количество = 100000; ре = Новый("V8RegEx"); ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Шаблон = "\d+"; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; ре.Pattern = "\d+"; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); /////////////////////////////////////// ре = Новый("V8RegEx"); ре.Шаблон = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ре.Pattern = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); Результаты: Цитата: Окончание замера "Замер_31" - Длительность = 5с, Среднее = 0.00005 с Окончание замера "Замер_32" - Длительность = 2.565с, Среднее = 0.00002565 с Окончание замера "Замер_33" - Длительность = 0.774с, Среднее = 0.00000774 с Окончание замера "Замер_34" - Длительность = 2.359с, Среднее = 0.00002359 с Выводы 1. Если не менять свойство "Шаблон"/"Pattern", то работает в 3 раза быстрее, чем VBшная. 2. Если не менять свойство "Шаблон"/"Pattern", то работает в 2 раза медленнее чем VBшная. 3. Установка свойства "Шаблон" либо пока реализована криво (очень хотелось бы надеяться что это так :) ), либо туда "перетекает" куча предварительных действий перед поиском, которые VBшная выполняет при Execute. | |||
| 25
    
        rs_trade 09.04.13✎ 14:44 | 
        (0) Автору респект. Реально полезная в хозяйстве вещь.     | |||
| 26
    
        orefkov 09.04.13✎ 14:58 | 
        (24)
  Скорее всего VB при присваивании Pattern просто видит, что он не изменился, и не перекомпиливает его. В моей ВК всегда происходит переподготовка выражения. Попробуй проверь так: Шаблоны = Новый Массив(2) Шаблоны[0] = "\d+" Шаблоны[0] = "\D+" ... ре.Pattern = Шаблоны[Количество % 2]; ... ре.Шаблон = Шаблоны[Количество % 2]; | |||
| 27
    
        Зойч 09.04.13✎ 15:00 | 
        Как говорится:
  Если вы решили проблему с помощью регулярок, то теперь у вас 2 проблемы | |||
| 28
    
        orefkov 09.04.13✎ 15:10 | 
        (24)
  Я перенес в существующую тему - http://snegopat.ru/forum/viewtopic.php?f=5&t=444&p=5195#p5195 (27) Я ждал этой фразы :) http://habrastorage.org/storage/habraeffect/d4/b2/d4b28d420d7b7482244540dbf7955323.jpg | |||
| 29
    
        orefkov 09.04.13✎ 15:12 | 
        +(26)
  Шаблоны[1] = "\D+" | |||
| 30
    
        vhl 09.04.13✎ 15:22 | 
        Ну, в общем если система высоконагруженная с несколькими десятками тысяч вызовов регекспов, то может и есть смысл во внешней. А так чтобы распарсить страничку или письмо несколько десятков раз в день все потребности покрывает стандартный VB.     | |||
| 31
    
        Зойч 09.04.13✎ 15:23 | 
        а какие есть области применения  регэкспов, кроме (30) ?     | |||
| 32
    
        Зойч 09.04.13✎ 15:24 | 
        вот в запросах можно было бы юзать     | |||
| 33
    
        rs_trade 09.04.13✎ 15:32 | 
        (31) мусорные данные разгребать.     | |||
| 34
    
        orefkov 09.04.13✎ 15:44 | 
        (31)
  Так я и не спорю. Просто под линуксом VBScript'а нету, так что смысл есть допилить под линукс. | |||
| 35
    
        Зойч 09.04.13✎ 15:46 | 
        (34) тоже про это подумал. но для линукса как раз и нет версии то     | |||
| 36
    
        orefkov 09.04.13✎ 16:35 | 
        (35)
  В процессе уже. | |||
| 37
    
        TormozIT гуру 09.04.13✎ 16:41 | 
        Вот новый замер.
  ПодключитьВнешнююКомпоненту("D:\Program Files\1cv82\common\rex32.dll", "V8RegEx", ТипВнешнейКомпоненты.Native); текст = "луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999"; Количество = 100000; ре = Новый("V8RegEx"); ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Шаблон = ""; ре.Шаблон = "\d+"; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; ре.Pattern = ""; ре.Pattern = "\d+"; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); /////////////////////////////////////// ре = Новый("V8RegEx"); ре.Шаблон = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат1 = Новый Массив; ре.Строка = текст; Пока ре.Найти() Цикл результат1.Добавить(ре.Группа(0)); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); ре = Новый COMОбъект("Vbscript.RegExp"); ре.Global = Истина; ре.Pattern = "\d+"; ЛксНачатьЗамер(Количество); Для К = 1 По Количество Цикл результат2 = Новый Массив; м = ре.Execute(текст); ЧислоВхождений = м.Count(); Для у = 0 По ЧислоВхождений - 1 Цикл результат2.Добавить(м.Item(у).Value); КонецЦикла; КонецЦикла; ЛксКончитьЗамер(); Результаты те же: Окончание замера "Замер_37" - Длительность = 5.001с, Среднее = 0.00005001 с Окончание замера "Замер_38" - Длительность = 2.63с, Среднее = 0.0000263 с Окончание замера "Замер_39" - Длительность = 0.77с, Среднее = 0.0000077 с Окончание замера "Замер_40" - Длительность = 2.346с, Среднее = 0.00002346 с | |||
| 38
    
        orefkov 09.04.13✎ 16:42 | 
        (37)
  Спасибо, буду думать. | |||
| 39
    
        RomaH naïve 10.04.13✎ 14:06 | 
        а подскажите шаблон для поиска любого слова или числа (целого) в строке
  мама мыла-раму 25.7 минуты получить в итоге: мама мыла раму 25 7 минуты ? | |||
| 40
    
        rs_trade 10.04.13✎ 14:20 | 
        (39) \b\w+\b  что то похожее | |||
| 41
    
        grinay 11.04.13✎ 03:39 | 
        Где же ты был неделю назад ) Импортирую базу из foxpro и там адреса помещений порядка 20000 записей по 40 предприятий. Все написаны абы как. Только регуляркой все пришлось парсить. И как же мне не хватало в VB регулярке 
  (?=pattern) look-ahead (?!pattern) look-ahead (?<=pattern) look-behind (?<!pattern) look-behind У вас это все реализованно? | |||
| 42
    
        orefkov 11.04.13✎ 08:33 | 
        (41) Да, все работает, что указано на http://userguide.icu-project.org/strings/regexp     | |||
| 43
    
        Лефмихалыч 11.04.13✎ 08:57 | 
        (0) это в смысле оно на халяву штоле?     | |||
| 44
    
        orefkov 11.04.13✎ 09:00 | 
        (43)
  Угу. Даром. | |||
| 45
    
        Славен 11.04.13✎ 09:01 | 
        (43)ты это давай молчи, у меня пока качается, а то натолкнешь тс на ненужную мысль     | |||
| 46
    
        Славен 11.04.13✎ 09:01 | 
        Спасибо     | |||
| 47
    
        Лефмихалыч 11.04.13✎ 09:04 | 
        (44)  спасибо!     | |||
| 48
    
        orefkov 11.04.13✎ 09:05 | 
        (45)
  Не, это точно платной не будет :) | |||
| 49
    
        Asmody 11.04.13✎ 09:15 | 
        [движок регулярных выражений, который идет с 1С - ICU.] - вот это поворот!     | |||
| 50
    
        orefkov 11.04.13✎ 09:19 | 
        (49)
  А ты загляни в папку bin - там лежат файлики icuXXX4x.dll 1C их юзает для работы с юникодом и для работы с ресурсными файлами (http://snegopat.ru/main/wiki?name=Ресурсы+1С) Но, в этой библиотеке заодно еще есть регэкспы. Я просто "мостик" сделал из языка 1С к этим методам. | |||
| 51
    
        Asmody 11.04.13✎ 09:20 | 
        orefkov молодец! пошел качать, заодно снегопат прикуплю. вроде бы и не нужен особо, но хочется как-то отблагодарить человека     | |||
| 52
    
        orefkov 11.04.13✎ 09:21 | ||||
| 53
    
        orefkov 11.04.13✎ 09:23 | 
        (51)
  Ну, пиши если что мне на мыло orefkov на гмайле. Можно и скидки обсудить :) | |||
| 54
    
        Asmody 11.04.13✎ 09:26 | 
        (52) ошибка в распознающем регекспе в движке     | |||
| 55
    
        HeroShima 11.04.13✎ 09:33 | 
        (51) два бери! а лучше три)     | |||
| 56
    
        orefkov 15.04.13✎ 12:57 | 
        Значительно доработал компоненту:
  - Работает и как Native ВК, и как аддин к снегопату. - Интерфейс доработан для совместимости с VBScript.Regexp, теперь в коде достаточно изменить только создание объекта. - Обновлено описание. - Исправлены ошибки. Скачать - http://snegopat.ru/downloads/rex-v8-1.0.0.1.zip Описание - http://snegopat.ru/scripts/doc/trunk/rex/readme.markdown | |||
| 57
    
        orefkov 15.04.13✎ 15:56 | 
        Исправил ряд ошибок.
  http://snegopat.ru/downloads/rex-v8-1.0.0.2.zip | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |