使用捕获组
如果需要从输入字符串中提取字符串的一部分,我们可以使用正则表达式的捕获组。
对于此示例,我们将从简单的电话号码正则表达式开始:
\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"