|
Регулярные выражения | ☑ | ||
---|---|---|---|---|
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
|
(0) что-то похожее надо?
http://memearchive.net/memerial.net/5615/yo-dawg-i-herd-you-like-regex.jpg |
|||
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
|
||||
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(Текст); Если НЕ Результат Тогда ОписаниеОшибки = "Текст не соответствует регулярному выражению"; Возврат Ложь; КонецЕсли; Исключение ОписаниеОшибки = ОписаниеОшибки(); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |