Li *_*ong 14 java regex nested
我想在括号内匹配一个字符串,如:
(i, j, k(1))
^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
该字符串也可以包含闭括号.如何在不编写解析器的情况下将它与Java中的正则表达式匹配,因为这只是我项目的一小部分.谢谢!
编辑:
我想寻找一个字符串块,并找到像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语言翻译应用.
acd*_*ior 24
正如我所说的,流行的看法相反(不相信一切人说)匹配嵌套的括号内是可能的正则表达式.
使用它的缺点是你只能达到固定的嵌套级别.对于您希望支持的每个额外级别,您的正则表达式将越来越大.
但是不要相信我的话.让我演示给你看.正则表达式:
\([^()]*\)
Run Code Online (Sandbox Code Playgroud)
\(([^()]*|\([^()]*\))*\)
Run Code Online (Sandbox Code Playgroud)
等等.要继续添加级别,您所要做的就是将中间(第二)[^()]*
部分更改为([^()]*|\([^()]*\))*
(此处检查三个级别).正如我所说,它会变得越来越大.
对于您的情况,两个级别可能就足够了.所以它的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"));
Run Code Online (Sandbox Code Playgroud)
输入:
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.
Run Code Online (Sandbox Code Playgroud)
输出:
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.
Run Code Online (Sandbox Code Playgroud)
在一般情况下,解析器会做得更好 - 这就是为什么人们会如此痴迷它.但对于简单的应用程序,正则表达式就足够了.
注意:一些正则表达式支持嵌套操作符R
(Java不支持,像PHP和Perl那样的PCRE引擎),它允许您嵌套任意数量的级别.有了他们,你可以这样做:\(([^()]|(?R))*\)
.