如何匹配Java中括号内的字符串(嵌套)?

我想在括号内匹配一个字符串,如:

(i, j, k(1)) ^^^^^^^^^^^^ 

该字符串也可以包含闭括号。 如何在不编写解析器的情况下将它与Java中的正则表达式匹配,因为这只是我项目的一小部分。 谢谢!

编辑:

我想搜索一个字符串块并找到类似u(i, j, k)u(i, j, k(1))或者u() ,并将它们替换为__u%array(i, j, k)我的Fortran翻译应用程序的__u%array(i, j, k)__u%array(i, j, k(1))

正如我所说,与正则表达式相反,可以使用与嵌套括号匹配的流行信念(不要相信人们所说的一切)。

使用它的缺点是你只能达到固定的嵌套级别 。 对于您希望支持的每个额外级别,您的正则表达式将越来越大。

但是不要相信我的话。 我来给你展示。 正则表达式:

 \([^()]*\) 

匹配一个级别 。 最多两个级别 ,您需要:

 \(([^()]*|\([^()]*\))*\) 

等等。 要继续添加级别,您所要做的就是将中间(第二个) [^()]*部分更改为([^()]*|\([^()]*\))* ( 在此处检查三个级别) )。 正如我所说,它会变得越来越大。

你的问题:

对于您的情况,两个级别可能就足够了。 所以它的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))*\)

分开你的工作。 正则表达式是:

 ([az]+)\((.*)\) 

第一组将包含标识符,第二组将包含参数。 然后继续这样做:

 private static final Pattern PATTERN = Pattern.compile("([az]+)\\((.*)\\)"); // ... final Matcher m = Pattern.matcher(input); if (!m.matches()) // No match! Deal with it. // If match, then: final String identifier = m.group(1); final String params = m.group(2); // Test if there is a paren params.indexOf('(') != -1; 

[az]+替换为Fortran中的标识符。

请检查这个答案,因为它基本上是你尝试做的(简而言之,regexps不太可能)

正则表达式匹配外括号