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

标签 java regex nested

我想匹配括号内的字符串,例如:

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

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

编辑:

我想搜索一个字符串 block 并找到类似 u(i, j, k) 的内容, u(i, j, k(1))或者只是 u(<anything within this paired parens>) , 并将它们替换为 __u%array(i, j, k)__u%array(i, j, k(1))用于我的 Fortran 翻译应用程序。

最佳答案

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

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

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

\([^()]*\)

Matches one level .对于 up to two levels ,你需要:

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

等等。要继续添加关卡,您只需将中间(第二个)[^()]* 部分更改为 ([^()]*|\([^()] *\))* ( check three levels here )。正如我所说,它会变得越来越大。

您的问题:

对于您的情况,两个级别可能就足够了。所以它的 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 不支持,PCRE 引擎如 PHP 和 Perl 支持),这允许您嵌套任意数量的级别。使用它们,您可以执行以下操作:\(([^()]|(?R))*\)

关于java - 如何在 Java 中匹配括号内的字符串(嵌套)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759004/

相关文章:

java - int 数组到 BufferedImage

php正则表达式删除HTML

java - Log4j模式,如何表示空格

css - Ember 两级导航 active-CSS 链接不起作用

dictionary - 在巨大的 clojure map 中过滤不必要的键

nested - Redux 更新嵌套状态数组

java - jTSS "There seems no TCS running"

java - 为什么在java8中使用 "default"关键字

java - 我如何在 Java 中并行运行一些东西?

regex - Twitter 状态 URL 正则表达式