Java 正则表达式分组匹配

前几篇文章都是简单判断是否满足匹配规则,当需要提取匹配结果时就用到分组匹配

分组匹配 可以判断是否满足正则表达式,然后提取出子串。
Java 正则表达式分组匹配_第1张图片
有些时候电话号码是以 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

你可能感兴趣的:(正则表达式,regex,Java,java,正则表达式,开发语言)