Какой диалект регулярных выражений понимает ZP?

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
Вопрос: а какого стандарта регулярные выражения поддерживаются в Зенке? Какие онлайн-сервисы или программы вы используете для конструирования сложных выражений? Так, чтобы при переносе в "Конструктор регулярных выражений" и потом в код они работали.

Я вот смотрю на популярный сервис Regexr, на котором огромная библиотека готовых сниппетов в двух форматах: PCRE (Server), JavaScript (Browser).... Например:
^([A-ZÄÖÜ][a-zäöüß]+(([.] )|( )|([-])))+[1-9][0-9]{0,3}[a-z]{0,1}([-][1-9][0-9]{0,3}[a-z]{0,1})?$ или
/\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b/g - не работают.

Ни одна регулярка оттуда в Зенке (по-крайней мере, в Конструкторе регулярок) нормально не отрабатывается.

Если брать сниппеты оттуда, то надо ещё как-то их редактировать, чтобы они начали работать? Как? Или лучше брать другой мастер/генератор/конструктор? Какой?

Помогите! В документации ответа не нашёл.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 527
Благодарностей
1 323
Баллы
113
Вопрос: а какого стандарта регулярные выражения поддерживаются в Зенке? Какие онлайн-сервисы или программы вы используете для конструирования сложных выражений? Так, чтобы при переносе в "Конструктор регулярных выражений" и потом в код они работали.

Я вот смотрю на популярный сервис Regexr, на котором огромная библиотека готовых сниппетов в двух форматах: PCRE (Server), JavaScript (Browser).... Например:
^([A-ZÄÖÜ][a-zäöüß]+(([.] )|( )|([-])))+[1-9][0-9]{0,3}[a-z]{0,1}([-][1-9][0-9]{0,3}[a-z]{0,1})?$ или
/\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b/g - не работают.

Ни одна регулярка оттуда в Зенке (по-крайней мере, в Конструкторе регулярок) нормально не отрабатывается.

Если брать сниппеты оттуда, то надо ещё как-то их редактировать, чтобы они начали работать? Как? Или лучше брать другой мастер/генератор/конструктор? Какой?

Помогите! В документации ответа не нашёл.
У вас стандартный в регулярке диалект, такой как в зенно.

Что бы регулярка сработала, вам нужно понимать что значит каждый символ, я вам в другой теме скинул шпаргалку по регуляркам, вот с нее и начните, либо задавайте конкретный вопрос, что регулярка должна сделать, что бы вам помогли решить задачу. А универсального метода одна регулярка на все случаи жизни - нету.

Wiki
Тема по регуляркам
 
Последнее редактирование:
  • Спасибо
Реакции: Juniorcpa

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Было бы не плохо как-то оптимизировать их и понимать какие регулярки жрут меньше ресурсов. Может есть какой-то онлайн чекер регулярок?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Было бы не плохо как-то оптимизировать их и понимать какие регулярки жрут меньше ресурсов. Может есть какой-то онлайн чекер регулярок?

95226


95227
 
  • Спасибо
Реакции: Mikhail B. и DevOps

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Ни одна регулярка оттуда в Зенке (по-крайней мере, в Конструкторе регулярок) нормально не отрабатывается.
а где примеры, что не нормально отрабатывают ?
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
У вас стандартный в регулярке диалект, такой как в зенно.

Что бы регулярка сработала, вам нужно понимать что значит каждый символ, я вам в другой теме скинул шпаргалку по регуляркам, вот с нее и начните, либо задавайте конкретный вопрос, что регулярка должна сделать, что бы вам помогли решить задачу. А универсального метода одна регулярка на все случаи жизни - нету.

Wiki
Тема по регуляркам
Спасибо за ваш ответ там и здесь! Это хорошая новость, что стандарт совпадает, но какой из двух используется в ZP? Там их два. Естественно, я не ожидаю, что подойдёт "одна регулярка на все случаи жизни". С другой стороны, когда по всем типовым задачам они уже написаны и протестированы, и есть в каталоге, зачем изобретать их заново? В той же карточке, которую вы указали, только про часть выражений написано, что они поддерживаются всеми. Какие из них ZP НЕ поддерживает? Огласите весь список, пожалуйста.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 527
Благодарностей
1 323
Баллы
113
но какой из двух используется в ZP
Если вы про то, что вы зашли на сайт https://regexr.com/ и вдруг увидели там 2 вкладки и посчитали что есть много разновидностей Regex, то вы наверное просто не читали что пишет на втором режиме:
95229
А если просто загуглить, что такое регулярка, вы бы увидели ответ:
95230

Т.е. как минимум у вас должен был возникнуть вопрос, а почему куда бы вы не зашли в гугле, даже загуглив Виды Regex нету никаких видов (хотя чисто теоретически может какие-то разновидности по доп функциям и есть, но первый раз слышу о глобальных разновидностях regex и проблемами с подбором регулярок).

Но проблема даже не в этом, вместо того, что бы попытаться делать регулярки по примерам и зайти, спросить - "вот у меня есть регулярка, я ее в взял на сайте вот здесь... - она должна мне вырезать вот это слово, но не вырезает в зеннопостере, а на сайте вырезает." - вы начали с непонятных историй, которые стоило бы начинать после нескольких неудачных попыток узнать ответы на конкретные регулярки - почему же они не срабатывают?

Предоставьте пожалуйста варианты регулярок, которые работают на сайте, а не работаю в зеннопостере на конкретном примере и начнем наконец-то двигаться.
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
550
Благодарностей
1 131
Баллы
93
Вопрос: а какого стандарта регулярные выражения поддерживаются в Зенке? Какие онлайн-сервисы или программы вы используете для конструирования сложных выражений? Так, чтобы при переносе в "Конструктор регулярных выражений" и потом в код они работали.

Я вот смотрю на популярный сервис Regexr, на котором огромная библиотека готовых сниппетов в двух форматах: PCRE (Server), JavaScript (Browser).... Например:
^([A-ZÄÖÜ][a-zäöüß]+(([.] )|( )|([-])))+[1-9][0-9]{0,3}[a-z]{0,1}([-][1-9][0-9]{0,3}[a-z]{0,1})?$ или
/\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b/g - не работают.

Ни одна регулярка оттуда в Зенке (по-крайней мере, в Конструкторе регулярок) нормально не отрабатывается.

Если брать сниппеты оттуда, то надо ещё как-то их редактировать, чтобы они начали работать? Как? Или лучше брать другой мастер/генератор/конструктор? Какой?

Помогите! В документации ответа не нашёл.
Привет.) *Сегодня вечером отвечу в телеграм.

Regexp старый формальный язык. Разные языки программирования делали для него разные фичи, которых например на .Net нет. Отсюда и путаница.
Вот по тайм коду пример, который вспомнился [видео с тайм кодом]. Вообще советую посмотреть полностью.

Суть в том, что регулярку нужно экранировать для C#. Про тестер от ZP лучше забыть. Когда такие длинные случаи, лучше всего использовать https://regex101.com/.

Также надо помнить, работа с группами и цикличностью в регулярке отсутствует. Хотя на JS и PHP они используются.

Примеры:
^([A-ZÄÖÜ][a-zäöüß]+(([.] )|( )|([-])))+[1-9][0-9]{0,3}[a-z]{0,1}([-][1-9][0-9]{0,3}[a-z]{0,1})?$
C#:
string text = "";
bool test = Regex.IsMatch(text, "^([A-ZÄÖÜ][a-zäöüß]+(([.] )|( )|([-])))+[1-9][0-9]{0,3}[a-z]{0,1}([-][1-9][0-9]{0,3}[a-z]{0,1})?$",
                          RegexOptions.Multiline);
/g это флаг говорящий о полнотекстовом поиске. Насколько я помню, полнотекстовый вариант в C# работает из коробки, но также вызвать его можно двумя способами.
В методе: RegexOptions.Multiline
C#:
string text = "";
bool test = Regex.IsMatch(text, "\\b((?:0[1-46-9]\\d{3})|(?:[1-357-9]\\d{4})|(?:[4][0-24-9]\\d{3})|(?:[6][013-9]\\d{3}))\\b",
                           RegexOptions.Multiline);
или с помощью флага (?m)
C#:
string text = "";
bool test = Regex.IsMatch(text, "(?m)\\b((?:0[1-46-9]\\d{3})|(?:[1-357-9]\\d{4})|(?:[4][0-24-9]\\d{3})|(?:[6][013-9]\\d{3}))\\b");
На всякий случай скажу, что сами регулярки не тестил, но выглядят рабочими.)
 
Последнее редактирование:
  • Спасибо
Реакции: Sho и Sergodjan

August TS

Client
Регистрация
28.09.2018
Сообщения
7
Благодарностей
10
Баллы
3
Также надо помнить, работа с группами и цикличностью в регулярке отсутствует.
Протестировал, захват и неименованные группы работают в Зенно, более того даже развернуто пишет в логе о ссылке на несуществующую группу.

Выражение:

(ма|(па))\2

Текст:

мама
папа


Как и ожидается удовлетворяет папа, делаем группу неименованной (?:па)

(ма|(?:па))\2

Зеннопостер с уважением информирует:
"(ма|(?:па))\2" - Ссылка на неопределенный номер группы 2.
 
  • Спасибо
Реакции: djaga

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
550
Благодарностей
1 131
Баллы
93
Протестировал, захват и неименованные группы работают в Зенно, более того даже развернуто пишет в логе о ссылке на несуществующую группу.

Выражение:

(ма|(па))\2

Текст:

мама
папа


Как и ожидается удовлетворяет папа, делаем группу неименованной (?:па)

(ма|(?:па))\2

Зеннопостер с уважением информирует:
"(ма|(?:па))\2" - Ссылка на неопределенный номер группы 2.
Согласен.) А вы видео посмотрели?
 

August TS

Client
Регистрация
28.09.2018
Сообщения
7
Благодарностей
10
Баллы
3
А вы видео посмотрели?
В видео по таймкоду выше чудовищная ошибка - он ожидает от группы захвата поведения квантификатора, т.е повторение шаблона, а группа служит для отлова повторяющихся значений. На ожидаемо рабочее поведение рассказывает что в MS "всё сломано".
Джеффри Фридл Регулярные выражения или Бен Форта Регулярные выражения за 10 минут.Cжато и структурировано.
Если по тяжелой заходить в regex:
https://www.regular-expressions.info/
В ZP и именованные группы работают (?<группа один>) или (?'группа два'), да всё думаю работает что прописано для .NET 1-4.8, нет никакой "специальной" зеннолаб версии, может только в конструкторе причуды.
Прочитал 100 стр Фридла, ничего особенного, но всё таки нюансы всплывают в которые не вникал, вот например, что опережающая(ретроспективная) проверка находит сама по себе позицию и этим можно красиво пользоваться:
Вроде - взять три цифры с начала(или с конца) только 10(15)-значного числа

\d{3}(?<=\b\d{10}\b)

(?=\b\d{
15}\b)\d{3}


Т.е сперва мы находим край(начало или конец) именно 10(15) значного числа, а затем забираем оттуда три цифры.
Этот пример на regex101
 
  • Спасибо
Реакции: Sho и djaga

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)