该程序应该匹配


(as(fd))_ n


并将其转换为


\ pochhammer {as(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 {a + d} {n} \ ,,


什么时候应该转换为


W_n(-a ^ 2; a,b,c,d)= \ pochhammer {a + b} {n} \ pochhammer {a + c} {n} \ pochhammer {a + 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不能为)[^)]表示-除)之外的每个字符)。

10-07 23:05