一个字符串就是一个正则表达。

如字符串"\D"在Java中表示非数字([^0-9]),而Java代码里字符串中的'\'符号需要转义,所以要表示这个正则表达式需要用"\\D"


Java中和正则表达式相关的主要有两个类:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
  • Pattern类表示的是某种匹配模式。一个Pattern对象和一个正则表达式相关联,而不表示具体的匹配。
Pattern pattern = Pattern.compile("[a-z]\\d{3}.*");
  • Matcher类表示的是具体的匹配。一个Matcher对象和一个具体的字符串相关联,表示在指定模式下的这个字符串的匹配。
Matcher matcher = pattern.matcher("hello123world");

具体的匹配信息都在Matcher对象中,所以多个Matcher对象可以共享一个Pattern对象。

查看给定的字符串是否完全匹配指定模式:

System.out.println(matcher.matches()); // true

// 下面的代码完全等价,这是一个简便方法
System.out.println(Pattern.matches("[a-z]+\\d{3}.*", "hello123world")); // true

看代码示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
  public static void main(String[] args) {
    String str = "汽车鲁A12345、京A98765、辽B55555超速";
    String pattern = "(\\D{2})(\\d+)"; 
    
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(str);

    // 给出的整个字符串str是否符合正则表达式pattern
    System.out.println(m.matches()); // false

    System.out.println("==========匹配查找");
    while (m.find()) { // 从str开头查找符合正则表达式的子串,每次查找会从上一次找到的位置后继续往后查找
      String print = String.format("分组2出现的位置索引: %d, 分组2内容<%s>", m.start(2), m.group(2));
      System.out.println(print);
    }

    System.out.println("==========重置匹配器,重置查找位置");
    m.reset(); // 重置匹配器,下一次不指定索引的查找从str头开始。此句可以省略,看下面注释
    
    int index = 10;
    while (m.find(index)) { // 从指定索引开始查找。由于指定了索引,之前的m.reset()对执行结果没影响,可以省略
      String print = String.format("此次匹配,分组数: %d,匹配的子串为<%s>,分组1内容<%s>,分组2内容<%s>", 
        m.groupCount(), m.group(0), m.group(1), m.group(2));
      System.out.println(print);
      
      index = m.end();
    }

    System.out.println("==========重置匹配器,重置输入序列");
    m.reset("鲁B99999"); // 重置匹配器的输入序列
    while (m.find()) {
      String print = String.format("分组2出现的位置索引: %d, 分组2内容<%s>", m.start(2), m.group(2));
      System.out.println(print);
    }
  }
}

程序输出:

false
==========匹配查找
分组2出现的位置索引: 4, 分组2内容<12345>
分组2出现的位置索引: 12, 分组2内容<98765>
分组2出现的位置索引: 20, 分组2内容<55555>
==========重置匹配器,重置查找位置
此次匹配,分组数: 2,匹配的子串为<京A98765>,分组1内容<京A>,分组2内容<98765>
此次匹配,分组数: 2,匹配的子串为<辽B55555>,分组1内容<辽B>,分组2内容<55555>
==========重置匹配器,重置输入序列
分组2出现的位置索引: 2, 分组2内容<99999>