1. 程式人生 > >捕獲和非捕獲

捕獲和非捕獲

單純說到捕獲,他的意思是匹配表示式,但捕獲通常和分組聯絡在一起,也就是“捕獲組”。

捕獲組:匹配子表示式的內容,把匹配結果儲存到記憶體中數字編號或顯示命名的組裡,以深度優先進行編號,之後可以通過序號或者名稱來使用這些匹配結果。

根據命名方式的不同,又可以分為兩組:

  • 數字編號捕獲組

語法:(exp)

解釋:從表示式左側開始,每出現一個左括號和它對應的右括號之間的內容為一個分組,在分組中,第0組為整個表示式,第一組開始為分組。

比如固定電話的:020-85653333

它的正則表示式為:(0\d{2})-(\d{8})

序號
編碼 分組 內容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 1 (0\d{2}) 020
2 2 (\d{8}) 85653333

我們用程式碼來驗證:

String regex = "(0\\d{2})-(\\d{8})";
    String text = "020-85653333";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher 
= pattern.matcher(text); if (matcher.find()) { System.out.println("分組個數:" + matcher.groupCount()); for (int i = 0; i <= matcher.groupCount(); i++) { System.out.println("第" + i + "個分組為:" + matcher.group(i)); } }

分組個數:2
第0個分組為:020-85653333
第1個分組為:020
第2個分組為:85653333

 

 

  • 命名編號捕獲組

語法:(?<name>exp)

解釋:分組的命名由表示式中的name指定

比如號碼也可以這樣寫:(?<quhao>\0\d{2})-(?<haoma>\d{8})

序號 名稱 分組 內容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 quhao (0\d{2}) 020
2 haoma (\d{8}) 85653333

 

String regex = "(?<quhao>0\\d{2})-(?<haoma>\\d{8})";
    String text = "020-85653333";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    if (matcher.find()) {
        System.out.println("分組個數:" + matcher.groupCount());
        System.out.println(matcher.group("quhao"));
        System.out.println(matcher.group("haoma"));
    }
  •  非捕獲組

語法:(?:exp)

解釋: 和捕獲組剛好相反,它用來標識那些不需要捕獲的分組

比如上面的正則表示式,程式不需要用到第一個分組,那就可以這樣寫:(?:0\d{2})-(\d{8})

String test = "020-85653333";
    String reg = "(?:0\\d{2})-(\\d{8})";
    Pattern pattern = Pattern.compile(reg);
    Matcher mc = pattern.matcher(test);
    if (mc.find()) {
        System.out.println("分組的個數有:" + mc.groupCount());
        for (int i = 0; i <= mc.groupCount(); i++) {
        System.out.println("第" + i + "個分組為:" + mc.group(i));
        }
    }