[英]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.