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}
После этого не должно быть числа)