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

Java 这个模式匹配代码有什么问题吗?,java,regex,string,loops,Java,Regex,String,Loops,我想知道这个代码是否有任何错误,以匹配模式 F_4(a,r;c,y;x,d) 或 它应该将具有F_4的任何东西(某物,某物;某物,某物;某物,某物)与表示某物的任何字符串或字符相匹配。谢谢 while(line.contains("F_4")){ Pattern appellfiv = Pattern.compile("F_4[^(]*\\(([^,]+),([^;]+);([^,]+),([^;]+);([^,]+),([^)]+)\\)"); Match

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

 F_4(a,r;c,y;x,d) 

它应该将具有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}");
                }
}

最后一个参数是
\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}");

这是一个你可以试试的正则表达式。它的功能与您的相同,但
改革放松文本要求,同时收紧delimeters

 #  "F_4[^(;,]*\\(([^,]*),(?:([^;,]*)(?:;([^,]*))?),(?:([^;,]*)(?:;([^,]*))?),([^)]*)\\)"

 F_4
 [^(;,]* 
 \(
 ( [^,]* )               # (1)
 ,
 (?:
      ( [^;,]* )         # (2)
      (?:
           ;
           ( [^,]* )     # (3)
      )?
 )
 ,
 (?:
      ( [^;,]* )         # (4)
      (?:
           ;
           ( [^,]* )     # (5)
      )?
 )
 ,
 ( [^)]* )               # (6)
 \)

@RohitJain,我正在尝试使用matcher.find方法和matcher.replaceFirst用F_4{something}{something}{something}{something}{something}{something}{something}替换此模式的所有实例。但是,它不会转换任何实例。我认为模式可能有问题。嗯,你的正则表达式在第一个示例字符串上工作。您是否调用了正确的正则表达式函数?这种方法还存在其他一般性问题。第一,你一遍又一遍地编译同一个正则表达式。2.逗号
上有一个自然的分隔符,所以你不应该尝试用分号来分解它,而是分开进行。3.使用
+
量词时,应使用
*
。4.不知道是否必须匹配整行。代码是否进入循环?你能解释一下在你创建
appellmatch
之后你用
line
做什么吗?@UlugbekUmirov,在我创建了匹配之后,我试着用F_4{something}{something}{something}{something}{something}{something}{something}{something}{something}{。我将更新我的代码以包含替换项。是的,我知道这一点。我正在使用嵌套括号的解析器来解决这个问题。但是,如果参数没有嵌套的括号,它仍然不匹配。谢谢。你能解释一下“(?:”和“)?”是做什么的吗?为什么要使用[^;,]*而不是[^;]*?@user2825125-当然。在
[^;,]
中,not
将停止通过下一个主要逗号分隔符,而不是
是为了阻止它通过下一个小分号delimeter<代码>(?:..)
是可选的群集组。捕获组仍然相同。基本上,如果
丢失,它仍然与其他所有内容匹配,并且顺序正确。
 #  "F_4[^(;,]*\\(([^,]*),(?:([^;,]*)(?:;([^,]*))?),(?:([^;,]*)(?:;([^,]*))?),([^)]*)\\)"

 F_4
 [^(;,]* 
 \(
 ( [^,]* )               # (1)
 ,
 (?:
      ( [^;,]* )         # (2)
      (?:
           ;
           ( [^,]* )     # (3)
      )?
 )
 ,
 (?:
      ( [^;,]* )         # (4)
      (?:
           ;
           ( [^,]* )     # (5)
      )?
 )
 ,
 ( [^)]* )               # (6)
 \)