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