簡體   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