Это вторая часть серии учебных статей регулярных выражений.Он показывает, как lookaheads и вложенные ссылки могут использоваться для соответствия non- регулярному языку a n b n.Вложенные ссылки сначала вводятся в: Как это регулярное выражение находит треугольные числа?
Одним из архетипических non- обычных языков является:
L = { a
nb
n: n > 0 }
Это язык всех пустых строк non-, состоящих из некоторого числа a
за которым следует равное количество b
. Примерами строк на этом языке являются ab
, aabb
, aaabbb
.
Этот язык может показаться non- регулярным по лемме о перекачке. Это фактически архетипический контекстно-свободный язык, который может быть сгенерирован контекстно-свободной грамматикой S → aSb | ab
S → aSb | ab
.
Тем не менее, современные реализаторы регулярных выражений четко распознают больше, чем просто обычные языки. То есть, они не являются "регулярными" по определению формальной теории языка. PCRE и Perl поддерживают рекурсивное регулярное выражение, а.NET поддерживает определение балансирующих групп. Еще менее "причудливые" функции, например, обратное сопоставление, означает, что регулярное выражение не является регулярным.
Но насколько сильны эти "основные" функции? Можем ли мы распознать L
с помощью Java regex, например? Можем ли мы объединить образы и вложенные ссылки и иметь шаблон, который работает, например, с String.matches
для соответствия строкам типа ab
, aabb
, aaabbb
и т.д.?
Рекомендации
- perlfaq6: Можно ли использовать регулярные выражения Perl для соответствия сбалансированному тексту?
- MSDN - Элементы языка регулярного выражения - Определения балансировочной группы
- pcre.org - справочная страница PCRE
- regular-expressions.info - Lookarounds и группировка и обратные ссылки
-
java.util.regex.Pattern