Java使用捕获组

示例

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

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

\d{3}-\d{3}-\d{4}

如果将括号添加到正则表达式,则每组括号都被视为捕获组。在这种情况下,我们使用的是编号捕获组:

(\d{3})-(\d{3})-(\d{4})
^-----^ ^-----^ ^-----^
Group 1 Group 2 Group 3

在Java中使用它之前,我们一定不要忘记遵循Strings的规则,转义反斜杠,从而产生以下模式:

"(\\d{3})-(\\d{3})-(\\d{4})"

我们首先需要编译正则表达式模式来制作a Pattern,然后需要aMatcher来将输入字符串与模式匹配:

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)

Java SE 7

Java 7引入了命名捕获组。命名捕获组的功能与编号捕获组的功能相同(但是名称略有不同,但名称而不是数字)。使用命名的捕获组可以提高可读性。

我们可以更改上面的代码以使用命名组:

(?<AreaCode>\d{3})-(\d{3})-(\d{4})
^----------------^ ^-----^ ^-----^
AreaCode           Group 2 Group 3

要获取“ AreaCode”的内容,我们可以改用:

String aCode = phoneMatcher.group("AreaCode"); //"800"