Подпрограмма Regex работает в Npp, но странно ведет себя в PCRE - PullRequest
0 голосов
/ 22 октября 2018

Попытка выучить подпрограммы Regex.Я сделал это регулярное выражение, чтобы соответствовать IP-адресам.Он работает в Notepad ++, но когда я попробовал его в тестере PCRE в сети, он сопоставляет только IP-адреса с максимум двумя цифрами в последней группе.Можете ли вы помочь мне понять, почему?

\b((\d{1,2}|[01]\d{2}|2[0-4]\d|25[0-5])\.){3}(?2)\b 

В примере "192.168.0.219 192.168.0.21" на АЭС у меня 2 совпадения, в то время как PCRE (regex101.com) соответствует только второму адресу.

1 Ответ

0 голосов
/ 23 октября 2018

Notepad ++ использует boost для регулярных выражений.Смотрите здесь: Какой движок регулярных выражений использует Notepad ++? .Так что это может объяснить разницу.

Проблема в этом фрагменте \d{1,2}, который не будет работать так, как вы ожидаете с рекурсией (на PCRE).В нерекурсивном случае вы вынуждены находить точку после числа.

Но так как рекурсия нацелена на группу 2, вы «входите» в шаблон рекурсии, вы обнаружите \d{1,2} (21с 219) и завершить рекурсию.Затем при выходе ожидается, что вы найдете \b, но вы не нашли (вы нашли 9), поэтому вы потерпели неудачу.

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

Чтобы обе ветви работали одинаково, вы можете использовать это:

\b(([01]\d{2}|2[0-4]\d|25[0-5]|\d{1,2})\.){3}(?2)\b

То есть вы помещаете\d{1,2} как последний вариант.

Демонстрация

В общем, это хорошая практика для сортировки группопций (например, скажем, (aaa|aa|a)), так что самые длинные шаблоны появляются первыми (если возможно некоторое перекрытие)

В качестве альтернативы, если вы хотите сохранить такой же порядок в группе, вы можете использовать:

\b((\d{1,2}(?!\d)|[01]\d{2}|2[0-4]\d|25[0-5])\.){3}(?2)\b

(Мы добавляем отрицательный взгляд на \d{1,2} После этого не должно быть числа)

...