前几篇文章都是简单判断是否满足匹配规则,当需要提取匹配结果时就用到分组匹配。
分组匹配 可以判断是否满足正则表达式,然后提取出子串。
有些时候电话号码是以 123-4567-8899 这样显示的,我们要判断某个字符串是这种形式的并分别提起三段数字。
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexDemo {public static void main(String[] args) {Pattern p = Pattern.compile("(\\d{3})\\-(\\d{4})-(\\d{4})");Matcher m = p.matcher("123-4567-8899");if (m.matches()) {String s0 = m.group(0);String s1 = m.group(1);String s2 = m.group(2);String s3 = m.group(3);System.out.println("s0:"+s0);System.out.println("s1:"+s1);System.out.println("s2:"+s2);System.out.println("s3:"+s3);} else {System.out.println("error");}}}
结果,
s0:123-4567-8899
s1:123
s2:4567
s3:8899
Matcher.group(index)
方法,
- 参数传 0 表示 整个正则表达式匹配到的字符串 。
- 参数传 1 表示第 1 个子串,
- 参数传 2 表示第 2 个子串。
- 参数传 n 表示第 n 个子串。(注意子串数量,防止数组越界)
注意这两种写法是不同的,
Pattern p = Pattern.compile("(\\d{3})\\-(\\d{4})-(\\d{4})");// 写法1
Pattern p = Pattern.compile("\\d{3}\\-\\d{4}-\\d{4}");// 写法2
- 写法1 :正确的,每个子串用
()
包起来,共 3 个子串。调用Matcher.group(index)
传 0、1、2、3 都正常。 - 写法2 :只满足 m.matches() ,子串没有用
()
包起来,调用Matcher.group(index)
只能传 0,
否则报错java.lang.IndexOutOfBoundsException: No group 1