我想在括号内匹配一个字符串,例如:
(i, j, k(1)) ^^^^^^^^^^^^
该字符串也可以包含封闭的括号。如何在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语言翻译应用。
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))
正如我所说的,流行的看法相反(不相信一切人说)匹配嵌套的括号内 是 可能的正则表达式。
使用它的不利之处在于,您最多 只能将嵌套固定到一个水平 。对于您希望支持的每个其他级别,您的正则表达式将越来越大。
但是,请不要相信我。让我给你演示。正则表达式:
\([^()]*\)
匹配一个级别。对于最多两个级别,您需要:
\(([^()]*|\([^()]*\))*\)
等等。要继续添加级别,您要做的就是将中间(第二个)[^()]*部分更改为([^()]*|\([^()]*\))*(在此处检查三个级别)。正如我所说,它将越来越大。
[^()]*
([^()]*|\([^()]*\))*
对于您的情况,两个级别可能就足够了。因此,其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))*\)。
R
\(([^()]|(?R))*\)