正如我所说,与流行的看法相反(不要相信人们所说的一切),使用正则表达式匹配嵌套括号是可能的。
使用它的缺点是您只能达到固定级别的嵌套。对于您希望支持的每一个额外级别,您的正则表达式将越来越大。
但不要相信我的话。我来给你展示。正则表达式:
\([^()]*\)
匹配一级。对于最多两个级别,您需要:
\(([^()]*|\([^()]*\))*\)
等等。要继续添加级别,您只需将中间(第二)[^()]*
部分更改为([^()]*|\([^()]*\))*
(在此处检查三个级别)。正如我所说,它会变得越来越大。
你的问题:
对于您的情况,两个级别可能就足够了。所以它的Java代码是:
String fortranCode = "code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.";
String regex = "(\\w+)(\\(([^()]*|\\([^()]*\\))*\\))"; // (\w+)(\(([^()]*|\([^()]*\))*\))
System.out.println(fortranCode.replaceAll(regex, "__$1%array$2"));
输入:
code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.
输出:
code code __u%array(i, j, k) code code code code __u%array(i, j, k(1)) code code code u(i, j, __k%array(m(2))) should match this last 'u', but it doesnt.
底线:
在一般情况下,解析器会做得更好——这就是人们对它如此生气的原因。但是对于简单的应用程序,正则表达式就足够了。
注意:一些正则表达式支持嵌套运算符R
(Java 不支持,PHP 和 Perl 等 PCRE 引擎支持),它允许您嵌套任意数量的级别。有了它们,您可以\(([^()]|(?R))*\)
: