Как я могу рекурсивно сопоставить шаблон с помощью регулярных выражений? - PullRequest
6 голосов
/ 28 декабря 2011

Строка может быть похожа на одну из следующих:

a(b,c)
a(a(b,c),d)
a(a(a(a(a(b,c),d),a(e,f)),g),h)
etc

Я хочу соответствовать неограниченному числу «a (x, y)».Как я могу сделать это с помощью Regex?Вот что у меня есть:

\\w\\(((?:\\([a-zA-Z0-9]+\\))|(?:[a-zA-Z0-9]+)),((?:\\([a-zA-Z0-9]+\\))|(?:[a-zA-Z0-9]+))\\)

Это соответствует только двум рекурсиям "a (x, y)".

Ответы [ 5 ]

7 голосов
/ 28 декабря 2011

Стандартная библиотека Java regex lib не поддерживает рекурсию, поэтому вы не можете сопоставить с ней такие общие вложенные конструкции.

Но в разновидностях, которые поддерживают рекурсию (Perl, PCRE, .NET и т. Д.), Вы можете использовать выражения вроде:

\w+(?:\((?R)(?:,(?R))*\))?
2 голосов
/ 16 декабря 2016

Вы также можете использовать мою библиотеку регулярных выражений https://github.com/florianingerl/com.florianingerl.util.regex, которая поддерживает рекурсивные регулярные выражения!API в основном такой же, как и в java.util.regex, только требуемые операторы импорта отличаются, например,

Pattern p = Pattern.compile("(?<first>a\\((?<second>(?'first')|[a-zA-Z]),(?'second')\\))");
assert p.matcher("a(a(a(a(a(b,c),d),a(e,f)),g),h)").find();
0 голосов
/ 28 декабря 2011

2 варианта - 1) Используйте Lexical Analysis для самостоятельного сопоставления и замены шаблонов [ИЛИ] 2) Если вы хотите придерживаться Regex, используйте некоторое программирование оболочки (или любой другой язык поддержки) и вызывайте его из Java.

0 голосов
/ 28 декабря 2011

Я думаю, вы ищете что-то вроде:

a (x, y) = [az] ([az], [az])

regex = a (x, y) |a (регулярное выражение | y) |a (x, regex)

Не знаете, как это сделать на языке.

0 голосов
/ 28 декабря 2011

Язык, который вы описываете, не является обычным языком , поэтому он не может соответствовать регулярному выражению. Изучите лексический анализ (т.е. используйте парсер)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...