Java正则表达式使用

276 阅读3分钟

Pattern

Partten可以将普通的正则表达式编译成Partten对象

Pattern pattern = Pattern.compile("-|,");

Parttern对象常用的两个方法是split()matcher()

  1. split():按照匹配的字符串分割字符
    String s = "123-456,789-123";
    // 匹配-和,
    Pattern p = Pattern.compile("-|,");
    // 分割字符串
    String[] results = p.split(s);
    // 输出[123, 456, 789, 123]
    System.out.println(Arrays.toString(results));
    
  2. matcher():创建Matcher对象
    String s = "123-456,789-123";
    Pattern pattern = Pattern.compile("(\\d*-)(\\d*)");
    // 创建Matcher对象
    Matcher matcher = pattern.matcher(s);
    

Matcher

正则表达式中的括号()可以将匹配到的字符划分为不同的组,例如(A)(B(C)),则一共划分为(A), (B(C)), (C)三个组,而Matcher的对象可以获取到不同的组。

Matcher中常用的方法有reset()matches()find()group()start()end()replaceAll()

  1. reset():重置匹配器的状态
    String s = "123-456,789-123";
    Pattern pattern = Pattern.compile("(\d*-)(\d*)");
    Matcher matcher = pattern.matcher(s);
    
    // 因为每次匹配到第一个之后都会重置匹配器状态,所以会一直打印匹配的第一个字符串
    while (matcher.find()) {
        // 无限打印123-456
        System.out.println(matcher.group());
        // 重置匹配器的状态
        matcher.reset();
    }
    
    • 无参reset()重置当前字符串的匹配器状态
    • 有参reset()复用pattern正则匹配新的字符串
  2. matchers():完全匹配字符串返回true,不完全匹配字符串返回false
    String s = "123-456,789-123";
    Pattern pattern = Pattern.compile("(\d*-)(\d*)");
    Matcher matcher = pattern.matcher(s);
    
    // 只能匹配123-456或者789-123部分字段,无法全匹配,打印false
    System.out.println(matcher.matches());
    
  3. find():匹配字符串
    String s = "123-456,789-123";
    Pattern pattern = Pattern.compile("(\d*-)(\d*)");
    Matcher matcher = pattern.matcher(s);
    // 从头开始匹配
    System.out.println(matcher.find());
    // 从坐标12处开始匹配
    System.out.println(matcher.find(12));
    
    • 无参find()类似于迭代器,自动以上一次匹配成功的子串的下一个字符索引作为本次匹配的起点
    • 有参find()则可以指定开始匹配的位置
  4. group():结合find()使用,返回匹配到的字符串
    String s = "123-456,789-123";
    // 正则表达式一共分两个组:\d*-和\d*
    Pattern pattern = Pattern.compile("(\d*-)(\d*)");
    Matcher matcher = pattern.matcher(s);
    
    // 以匹配到第一个结果为例
    while (matcher.find()) {
        // 打印123-456
        System.out.println("group: " + matcher.group());
        // 打印123-
        System.out.println("group[1]: " + matcher.group(1));
        // 打印456
        System.out.println("group[2]: " + matcher.group(2));
    }
    
    • 无参group()返回find()匹配到的字符串,和group(0)效果一致
    • 有参group()返回find()匹配到的字符串的子串,例如获取第一个子串group(1)
  5. start()和end():结合find()使用,返回匹配到的字符串的开始坐标和结束坐标
    String s = "123-456,789-123";
    // 正则表达式一共分两个组:\d*-和\d*
    Pattern pattern = Pattern.compile("(\d*-)(\d*)");
    Matcher matcher = pattern.matcher(s);
    
    // 以匹配到第一个结果为例
    while (matcher.find()) {
        // 打印123-456
        System.out.println("group: " + matcher.group());
        // 打印0
        System.out.println("start: " + matcher.start());
        // 打印7
        System.out.println("end: " + matcher.end());
        // 打印456
        System.out.println("group[2]: " + matcher.group(2));
        // 打印4
        System.out.println("start[2]: " + matcher.start(2));
        // 打印7
        System.out.println("end[2]: " + matcher.end(2));
    }
    
    • 无参start()和end()分别返回find()匹配到的字符串开始位置和结束位置+1
    • 有参start()和end()分别返回find()匹配到的字符串的子串开始位置和结束位置+1
  6. replaceAll():替换匹配到的字符串
    String s = "123-456,789-123";
    Pattern pattern = Pattern.compile("(\d*-)(\d*)");
    Matcher matcher = pattern.matcher(s);
    // 返回replaceAll,replaceAll
    System.out.println(matcher.replaceAll("replaceAll"));