使用捕獲組

如果需要從輸入字串中提取字串的一部分,我們可以使用正規表示式的捕獲組

對於此示例,我們將從簡單的電話號碼正規表示式開始:

\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"