使用捕獲組
如果需要從輸入字串中提取字串的一部分,我們可以使用正規表示式的捕獲組。
對於此示例,我們將從簡單的電話號碼正規表示式開始:
\d{3}-\d{3}-\d{4}
如果將括號新增到正規表示式,則每組括號都被視為捕獲組。在這種情況下,我們使用所謂的編號捕獲組:
(\d{3})-(\d{3})-(\d{4})
^-----^ ^-----^ ^-----^
Group 1 Group 2 Group 3
在我們可以在 Java 中使用它之前,我們不要忘記遵循字串的規則,轉義反斜槓,從而產生以下模式:
"(\\d{3})-(\\d{3})-(\\d{4})"
我們首先需要編譯正規表示式模式來製作一個 Pattern
,然後我們需要一個 Matcher
來匹配我們的輸入字串和模式:
Pattern phonePattern = Pattern.compile("(\\d{3})-(\\d{3})-(\\d{4})");
Matcher phoneMatcher = phonePattern.matcher("abcd800-555-1234wxyz");
接下來,匹配器需要找到與正規表示式匹配的第一個子序列:
phoneMatcher.find();
現在,使用 group 方法,我們可以從字串中提取資料:
String number = phoneMatcher.group(0); //"800-555-1234" (Group 0 is everything the regex matched)
String aCode = phoneMatcher.group(1); //"800"
String threeDigit = phoneMatcher.group(2); //"555"
String fourDigit = phoneMatcher.group(3); //"1234"
注意: Matcher.group()
可以用來代替 Matcher.group(0)
。
Version >= Java SE 7
Java 7 引入了命名捕獲組。命名捕獲組的功能與編號捕獲組的功能相同(但使用名稱而不是數字),儘管有輕微的語法更改。使用命名捕獲組可提高可讀性。
我們可以改變上面的程式碼來使用命名組:
(?<AreaCode>\d{3})-(\d{3})-(\d{4})
^----------------^ ^-----^ ^-----^
AreaCode Group 2 Group 3
要獲取 AreaCode
的內容,我們可以使用:
String aCode = phoneMatcher.group("AreaCode"); //"800"