一个字符串就是一个正则表达。
如字符串"\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>