Имя: Пароль:
IT
 
Регулярные выражения
0 alexei366
 
24.04.13
17:02
Специфический вопрос тут у меня

Ктонить гденить видел, или ктонить может сделать регулярное выражение для проверки регулярного выражения?
1 ДенисЧ
 
24.04.13
17:02
А как ты будешь проверять регулярное выражение для проверки регулярного выражения?
2 Волшебник
 
24.04.13
17:03
что курил?
3 alexei366
 
24.04.13
17:04
(2) Да пока ниче
4 alexei366
 
24.04.13
17:06
(1) чо там проверять, нагуглим примеры регулярок да подставляй, оно же формат имеет какбы, только мега функцию писать неохота (типа нашли квадратную скобку тогда в ней должно быть тото), да и всех тонкостей я мож не знаю, но 1С в пакетахXDTO проверяет же
5 Rie
 
24.04.13
17:08
(0) А что такое "проверка регулярного выражения"? Что проверять-то надо?
6 Rie
 
24.04.13
17:09
(4) Хочешь проверить регулярным выражением синтаксис регулярного выражения? Не получится.
7 alexei366
 
24.04.13
17:10
(5) ну ты типа написал регулярку "[0-9a-f]{32}"(гуид без тирешек) и надо проверить что вот эта   х е р н я - проверочное выражение [0-9a-f]{32} имеет верный формат
8 alexei366
 
24.04.13
17:10
(6) Почему нет?
9 alexei366
 
24.04.13
17:11
(6) Регулярное выражение это же набор символов, подчиняющихся определённой логике, мне так казалось что возможно
10 Rie
 
24.04.13
17:13
(8) Регулярные выражения - КС-язык.
Регулярное выражение способно распознать лишь регулярный язык (потому оно так и называется).
11 Rie
 
24.04.13
17:14
(9) Рекомендую А.Ахо, Дж.Ульман, "Теория синтаксического анализа, перевода и компиляции", т. 1.
Или более позднюю "Компиляторы" ("Драконью книгу") тех же авторов.
12 alexei366
 
24.04.13
17:15
(10) Есть у тя идеи тогда каким образом регулярка проверяется на адекватность когда сохраняешь конфу перед тем как изменил какоенить рег выражение в ПакетеXDTO (если будет так "[0-9a-f]{32" 1С ругнется).
13 Rie
 
24.04.13
17:17
(12) КС-анализатор легко решает эту задачу. Но КС-анализатор - это _не_ регулярное выражение.
14 alexei366
 
24.04.13
17:19
(13) Терь тя немного стал понимать, мож если ты в теме не подскажешь мож сразу какуюнить практическую ссылочку кинешь, посмотреть как можно самому написать этот КС-анализатор, или лучше пример с рег выражениями
15 Rie
 
24.04.13
17:24
(14) Ссылку я дал выше - "Компиляторы" Ахо, Ульмана и соавторов.
В принципе, синтаксис регулярных выражений аналогичен синтаксису арифметических выражений - а синтаксический анализ арифметического выражения приводится практически в любом учебнике, причём как раз восходящим анализатором.
16 alexei366
 
24.04.13
17:25
(14) То что нашел содержит много теории, я пока на этот момент времени и сил не хочу тратить (просидеть несколько деньков), просто вроде вещь в моём проекте нужная, но на крайний случай её можно заменить заставляя после ввода регулярки сразу заставлять предоставлять коду 1 пример иначе регулярка не катит
17 Rie
 
24.04.13
17:34
(16) Если тебе просто нужно проверить регулярное выражение на правильность - подсунь его RegExp'у.
Если сматерится - значит, выражение - неправильное. Если сжуёт, не поморщившись, - всё в порядке.
18 Rie
 
24.04.13
17:36
+(17) (Только имей в виду - материться он будет при попытке сопоставить, а не в момент задания свойства Pattern).
19 HeroShima
 
24.04.13
17:38
20 alexei366
 
24.04.13
17:47
(18) Да, надо проверить , собираюсь использовать как раз таки RegExp = Новый COMОбъект("VBScript.RegExp");
Есть конеш идея бредовая, типа создать пакетXDTO с одним типом, прописать в нем какойнить образец, выгрузить в xml, потом тупо заменять образец на то что ввели, записывать в файл, создавать фабрику и если создание фабрики успех то регулярка правильная.
22 Лефмихалыч
 
24.04.13
17:51
23 alexei366
 
24.04.13
18:26
(22) и чо это
24 Rie
 
24.04.13
18:35
(23) Это - шутка как раз по теме вопроса :-)
25 alexei366
 
24.04.13
18:45
(24) по теме то видна, а результат то где там?
26 alexei366
 
25.04.13
11:22
Блин мужики, как думаете стандартное средство 1С подойтёт для решения моей задачи в виде такого кода (всмысле не слишком ли это по затратам временным)

Патерн = "[0-9]{1,2}";
   ЧтениеXML = Новый ЧтениеXML;
   СтрокаXML = "<xs:schema xmlns:tns=""test"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""test"" attributeFormDefault=""unqualified"" elementFormDefault=""qualified"">
                   |<xs:simpleType name=""test"">
                   |<xs:restriction base=""xs:string"">
                   |<xs:pattern value="""+Патерн+"""/>
                   |</xs:restriction>
                   |</xs:simpleType>
                   |</xs:schema>";
   ЧтениеXML.УстановитьСтроку(СтрокаXML);
   ПостроительDOM = New ПостроительDOM;
   ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
   
   ПостроительСхемXML = Новый ПостроительСхемXML;
   СхемаXML = ПостроительСхемXML.СоздатьСхемуXML(ДокументDOM);
   НаборСхемXML = Новый НаборСхемXML;
   НаборСхемXML.Добавить(СхемаXML);
   ВремФабрикаXDTO = Новый ФабрикаXDTO(НаборСхемXML);
   
   ТипXDTO = ВремФабрикаXDTO.Тип("test","test");
   ЗначениеXDTO = ВремФабрикаXDTO.Создать(ТипXDTO,"34");
27 alexei366
 
25.04.13
11:47
АПП
28 alexei366
 
25.04.13
11:51
(26) Сделал вроде замера производительности, в итоге имеем на 300 циклов (в каждом идёт проверка строки на регулярку "[0-9]{1,2}" = "34" ):
1) объектами 1С - 165 мс
2) VBScript.RegExp - 7 мс
3) VBScript.RegExp с созданием COMОбъекта в каждом цикле - 57 мс
29 alexei366
 
25.04.13
11:52
(28) Вроде как объектами 1С мы можем непосредственно затестить  правильность написания регулярки а в VBScript.RegExp нет
30 alexei366
 
26.04.13
12:54
VBScript.RegExp возвращает Истину на метод Test если регулярка составленна некоректно по синтаксису. Вот блин.
31 orefkov
 
26.04.13
13:02
(30)
Возьми мою ВК - она ругается на неверное регулярное выражение.
https://snegopat.ru/downloads/rex-v8-1.0.0.2.zip
32 Rie
 
26.04.13
13:06
(30) _Примени_ RegExp с запихнутым в него регулярным выражением - он выскажется, если выражение неправильное.
33 orefkov
 
26.04.13
13:22
(30)
У меня VBScript в этом случае выкидывает исключение:
http://snegopat.ru/files/tmp/testrex.png
34 Ковычки
 
26.04.13
13:27
Метод Рупора Абсурда
35 Ковычки
 
26.04.13
13:29
36 orefkov
 
26.04.13
13:32
Ну вот как-то так получается:
Функция ПроверитьПаттерн(паттерн)
   ре = Новый COMОбъект("VBScript.RegExp");
   //ре = Новый ("V8RegEx");
   ре.Pattern = паттерн;
   Попытка
       ре.Test("");
   Исключение
       Возврат Ложь;
   КонецПопытки;
   Возврат Истина;
КонецФункции
37 alexei366
 
26.04.13
14:59
(36) А вот это же неверная регулярка - "[dfg\<>]"?
38 alexei366
 
26.04.13
15:02
(36) Я поставил точки останова - да действительно вываливается ошибка у VBScript.RegExp при попытке установить патерн некорректный.
Просто сама регулярка у меня проверяется средствами 1С, ей "[dfg\<>]" не нравиться а VBScript.RegExp нравиться, что за фигня.
39 badboychik
 
26.04.13
15:07
Можно написать конечный автомат, проверяющий регулярку. Одна часть будет проверять равновесие скобок - это элементарно. Другая - корректность всех метасимволов
40 alexei366
 
26.04.13
15:10
(39) Запариваться так то зачем, не хочу свой велосипед писать
41 orefkov
 
26.04.13
15:18
(37)
Вполне себе верная. Проверяет на совпадение с одним из перечисленных символов.
(38)
Ну так и проверяй тем способом, в котором потом будешь регулярку использовать.
42 alexei366
 
26.04.13
15:20
(41) Почему 1С не нравиться тогда.
Показываю монстра проверки регулярки на объектах 1С:

Функция ПроверитьВалидностьРегулярногоВыражения(РегВыр, ОписаниеОшибки = Неопределено) Экспорт
   
   Попытка
       
       ЧтениеXML = Новый ЧтениеXML;
       СтрокаXML = "<xs:schema xmlns:tns=""test"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""test"" attributeFormDefault=""unqualified"" elementFormDefault=""qualified"">
       |<xs:simpleType name=""test"">
       |<xs:restriction base=""xs:string"">
       |<xs:pattern value="""+ПолучитьЭкранированныйТекстXML(РегВыр)+"""/>
       |</xs:restriction>
       |</xs:simpleType>
       |</xs:schema>";
       ЧтениеXML.УстановитьСтроку(СтрокаXML);
       ПостроительDOM = Новый ПостроительDOM;
       ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
       
       ПостроительСхемXML = Новый ПостроительСхемXML;
       СхемаXML = ПостроительСхемXML.СоздатьСхемуXML(ДокументDOM);
       
       НаборСхемXML = Новый НаборСхемXML;
       НаборСхемXML.Добавить(СхемаXML);
       ВремФабрикаXDTO = Новый ФабрикаXDTO(НаборСхемXML);
       
   Исключение
       ОписаниеОшибки = ОписаниеОшибки();
       Возврат Ложь;
   КонецПопытки;
   
   Возврат Истина;
   
КонецФункции
43 alexei366
 
26.04.13
15:22
(42) Вот через него [dfg\<>] не проходит, а через VBScript.RegExp норм
44 alexei366
 
26.04.13
15:22
(43) А строку по регулярке я проверяю всетаки VBScript.RegExp:

Функция ПроверитьВалидностьТекстаПоРегулярномуВыражению(РегВыр, Текст, ОписаниеОшибки = Неопределено) Экспорт
   
   Попытка
       

       RegExp = Новый COMОбъект("VBScript.RegExp");
       RegExp.Pattern =  "^"+РегВыр+"$";
       Результат = RegExp.Test(Текст);
       Если НЕ Результат Тогда
           ОписаниеОшибки = "Текст не соответствует регулярному выражению";
           Возврат Ложь;
       КонецЕсли;
       
   Исключение
       ОписаниеОшибки = ОписаниеОшибки();
       Возврат Ложь;    
   КонецПопытки;
   
   Возврат Истина;
   
КонецФункции
Программист всегда исправляет последнюю ошибку.