我想知道这个代码是否有任何错误来匹配模式
F_4(a,r;c,y;x,d)
或
F_4\left(a,b;b,b;\frac{-xy}{(1-y)},\frac{v}{(1-x)}\right)
它应该匹配任何具有F_4(某些东西,东西,东西,东西,某物)的东西与任何表示某事物的字符串或字符。谢谢。
while(line.contains("F_4")){
Pattern appellfiv = Pattern.compile("F_4[^(]*\\(([^,]+),([^;]+);([^,]+),([^;]+);([^,]+),([^)]+)\\)");
Matcher appellmatch = appellfiv.matcher(line);
while(appellmatch.find()) {
line = appellmatch.replaceAll("\\AppellFiv@{$1}{$2}{$3}{$4}{$5}{$6}");
}
}
答案 0 :(得分:0)
您的上一个参数是\frac{v}{(1-x)}\right
,其中包含)
,因此您不能将[^)]+
用作最后一个参数的正则表达式。您可以尝试使用[^,;]+
或.+
正则表达式作为最后一个参数。
<强>更新强> 以下代码适用于您的第一种情况:
String line = "F_4(a,r;c,y;x,d);F_4(z,p;o,q;m,n);";
line = line.replaceAll("F_4[^(]*\\(([^,]+),([^;]+);([^,]+),([^;]+);([^,]+),([^)]+)\\)", "\\AppellFiv@{$1}{$2}{$3}{$4}{$5}{$6}");
答案 1 :(得分:0)
这是你可以尝试的正则表达式。它与你的功能相同但是 改进以放松文本要求,同时缩小分界线。
# "F_4[^(;,]*\\(([^,]*),(?:([^;,]*)(?:;([^,]*))?),(?:([^;,]*)(?:;([^,]*))?),([^)]*)\\)"
F_4
[^(;,]*
\(
( [^,]* ) # (1)
,
(?:
( [^;,]* ) # (2)
(?:
;
( [^,]* ) # (3)
)?
)
,
(?:
( [^;,]* ) # (4)
(?:
;
( [^,]* ) # (5)
)?
)
,
( [^)]* ) # (6)
\)