字符串可以是以下之一:
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)”的递归。
答案 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,正则表达式)
不确定如何使用某种语言。