这种模式匹配代码有什么问题吗?

时间:2014-03-29 19:02:48

标签: java regex string loops

我想知道这个代码是否有任何错误来匹配模式

 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}");
                }
}

2 个答案:

答案 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)
 \)