|
Регулярные выражения в 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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |