我想在括号中匹配一个字符串,如:
(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翻译应用程序。
答案 0 :(得分:22)
正如我所说的,与普遍的看法相反(不要相信人们所说的一切)与正则表达式匹配的嵌套括号 是可能的。
使用它的缺点是你可以只能达到固定的嵌套级别。对于您希望支持的每个额外级别,您的正则表达式将越来越大。
但是不要相信我的话。让我演示给你看。正则表达式:
\([^()]*\)
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没有,像PHP和Perl这样的PCRE引擎),它允许你嵌套任意数字水平。有了它们,您可以:\(([^()]|(?R))*\)
。
答案 1 :(得分:1)
分开你的工作。正则表达式是:
([a-z]+)\((.*)\)
第一组将包含标识符,第二组将包含参数。然后继续这样做:
private static final Pattern PATTERN = Pattern.compile("([a-z]+)\\((.*)\\)");
// ...
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;
将[a-z]+
替换为Fortran中的标识符。
答案 2 :(得分:0)
请检查这个答案,因为它基本上是你尝试做的(简而言之,它不是真的可以使用正则表达式)