您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

正如我所说的,流行的看法相反(不相信一切人说)匹配嵌套的括号内 可能的正则表达式。

使用它的不利之处在于,您最多 。对于您希望支持的每个其他级别,您的正则表达式将越来越大。

但是,请不要相信我。让我给你演示。正则表达式:

\([^()]*\)

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

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

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

对于您的情况,两个级别可能就足够了。因此,其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.

在一般情况下, 会做得更好-这就是人们对此大为恼火的原因。但是对于简单的应用程序,正则表达式就足够了。

某些类型的regex支持嵌套运算符R(Java不支持,而PHP和Perl等PCRE引擎不支持),它允许您嵌套任意数量的级别。与他们一起,您可以执行:\(([^()]|(?R))*\)

java 2022/1/1 18:13:43 有691人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶