该程序应该匹配
(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
不能为)
([^)]
表示-除)
之外的每个字符)。