Имя: Пароль:
1C
1С v8
Регулярные выражения в 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
+(50)
Ссылка неправильно вставилась:
http://snegopat.ru/main/wiki?name=Ресурсы+1С
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
2 + 2 = 3.9999999999999999999999999999999...