如何使用正则表达式递归匹配模式?

时间:2011-12-28 18:30:24

标签: java regex

字符串可以是以下之一:

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 个答案:

答案 0 :(得分:7)

Java的标准正则表达式lib不支持递归,因此您无法将此类常规嵌套构造与其匹配。

但是在支持递归(Perl,PCRE,.NET等)的版本中,您可以使用以下表达式:

\w+(?:\((?R)(?:,(?R))*\))?

答案 1 :(得分:2)

您还可以使用支持递归正则表达式的正则表达式库https://github.com/florianingerl/com.florianingerl.util.regex! API与java.util.regex基本相同,只是所需的import语句不同,例如。

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();

答案 2 :(得分:0)

您所描述的语言不是regular language,因此无法通过正则表达式进行匹配。查看lexical analysis(即使用解析器)

答案 3 :(得分:0)

2个选项 - 1)使用词法分析进行模式匹配&amp;自己更换[OR] 2)如果你想坚持使用正则表达式,那么使用一些shell编程(或任何支持语言)&amp;从Java中调用它。

答案 4 :(得分:-1)

我认为你正在寻找类似的东西:

a(x,y)= [a-z]([a-z],[a-z])

regex = a(x,y)| a(正则表达式| y)| a(x,正则表达式)

不确定如何使用某种语言。