繁体   English   中英

模式匹配有什么问题?

[英]What is wrong with the 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);
}

谢谢。

我可能弄错了,但也许您正在寻找类似的东西

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不能为)[^)]表示-除)之外的每个字符)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM