簡體   English   中英

使用 java regex Matcher 時出現意外結果

[英]Unexpected results when using java regex Matcher

我的測試程序中的正則表達式模式是:

"^#\\{\\S+\\}(:\\$\\{(\\d)\\})+$"

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexPatternTest2 {
    public static void main(String[] args) {
        String line1 = "#{aaa0}:${a22}:${10}";
        String line2 = "#{aaa0}:${0}:${1}";

        String line3 = "#{aaa0}:${a22}:${0}";

        check(line1);
        check(line2);
        check(line3);

    }
    public static void check(String line) {
        System.out.println("========================" + line);

        String keyPattern = "^#\\{\\S+\\}(:\\$\\{(\\d)\\})+$";

        Pattern r1 = Pattern.compile(keyPattern);
        Matcher m1 = r1.matcher(line);
        if(m1.matches()) {
            System.out.println("match line!");
        } else {
            System.out.println("error! can not match line: " + line);
        }
    }
}

我得到以下輸出:

========================#{aaa0}:${a22}:${10}
error! can not match line: #{aaa0}:${a22}:${10}
========================#{aaa0}:${0}:${1}
match line!
========================#{aaa0}:${a22}:${0}
match line!

我希望Pattern匹配String變量line2中的序列,但line3的測試結果讓我感到困惑。

問題是\\S會在回饋之前先吞下所有東西。

在您的第二個示例中,第一部分真正匹配#{aaa0}:${0} ,而不是您懷疑的#{aaa0}

因此,有理由認為第三行也匹配(第一部分匹配#{aaa0}:${a22} )......你必須用更精確的東西替換你的\\S (也許[^}] ?) .

如果要匹配多個數字,則需要在\\d之后添加 + 量詞:

\\d+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM