捕獲和非捕獲
阿新 • • 發佈:2018-11-10
單純說到捕獲,他的意思是匹配表示式,但捕獲通常和分組聯絡在一起,也就是“捕獲組”。
捕獲組:匹配子表示式的內容,把匹配結果儲存到記憶體中數字編號或顯示命名的組裡,以深度優先進行編號,之後可以通過序號或者名稱來使用這些匹配結果。 |
根據命名方式的不同,又可以分為兩組:
- 數字編號捕獲組
語法:(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)); } }