使用捕获组

如果需要从输入字符串中提取字符串的一部分,我们可以使用正则表达式的捕获组

对于此示例,我们将从简单的电话号码正则表达式开始:

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