模式匹配有什么问题?

时间:2014-03-04 19:59:10

标签: java regex pattern-matching

这个程序应该匹配

  

(如(FD))_Ñ

并将其转换为

  

\ pochhammer {如(FD)} {N}

但是,它没有正确转换字符串。正在转换

  

W_n(-a ^ 2; A,B,C,d)=(A + B)_n(A + C)_n(A + d)_n \ ,,

  

W_n \ pochhammer {-a ^ 2; A,B,C,d)=(A + B} {N} \ {pochhammer A + C} {N} \ {pochhammer一个+ d} {N} \ ,,

什么时候应该转换为

  

W_n(-a ^ 2; A,B,C,d)= \ pochhammer {A + B} {N} \ {pochhammer A + C} {N} \ {pochhammer一个+ d} {N} \ ,,

这是我的代码:

while(scanner.hasNextLine()) {
    String line = scanner.nextLine();
    Pattern cpochhammer = Pattern.compile("(\\((.*?)\\)_\\{([^}]+)\\})");
    Matcher pochhammer = cpochhammer.matcher(line);
    StringBuffer rplcmntBfr = new StringBuffer();

    while(pochhammer.find())  {
        pochhammer.appendReplacement(rplcmntBfr, "\\\\pochhammer{$2}{$3}");
    }

    pochhammer.appendTail(rplcmntBfr);  
    Pattern npochhammer = Pattern.compile("(\\((.*?)\\)_(.))");
    Matcher ppochhammer = npochhammer.matcher(rplcmntBfr. toString() );
    rplcmntBfr.setLength(0);

    while(ppochhammer.find())  {
        ppochhammer.appendReplacement(rplcmntBfr, "\\\\pochhammer{$2}{$3}");
    }

    ppochhammer.appendTail(rplcmntBfr);
    writer.println(rplcmntBfr);
}

感谢。

1 个答案:

答案 0 :(得分:1)

我可能会弄错,但也许你正在寻找像

这样的东西
String replaced = line.replaceAll("\\(([^)]*)\\)_(\\w+)", "\\\\pochhammer{$1}{$2}");
//                                                ^^^^ 
//                                  You can use \\d or \\d+ instead
//                                  this part. I am not sure what `n` can be

当您更详细地描述您的问题时,我可以尝试纠正我的答案,例如您在第一次循环中尝试实现的目标?将"(\\((.*?)\\)_\\{([^}]+)\\})"替换为\\\\pochhammer{$2}{$3}似乎毫无意义,因为您的输入中没有(xxx)_{n}

因此,第二个正则表达式(\\((.*?)\\)_(.))似乎只有问题。如果你仔细看看它,你不需要你的外括号,因为他们只会组1组2,所以而不是

    (\\((.*?)\\)_(.)) you can use 
     \\((.*?)\\)_(.)

接下来就是您正在使用.*?,这意味着可以匹配任何字符,因此\\((.*?)\\)_将匹配任何字符(和最后) _像你的情况一样

 W_n(-a^2;a,b,c,d)=(a+b)_n(a+c)_n(a+d)_n\,,
     ^^^^^^^^^^^^^^^^^^
     this part

结果为您提供

 W_n\pochhammer{-a^2;a,b,c,d)=(a+b}{n}\pochhammer{a+c}{n}\pochhammer{a+d}{n}\,,
                ^^^^^^^^^^^^^^^^^^

要解决此问题,您可以在我的解决方案中使用[^)]代替.。这样,您只会匹配单个而不是嵌套的括号,例如(xxx),因为x在这种情况下不能是)[^)]表示 - 除{{{}之外的每个字符1}})。