Pattern类用于创建一个正则表达式,也可以说是创建一个匹配模式。
Pattern的基础用法:
Pattern p = Pattern.compile("China");
String s = "123China456China789China";
String[] a = p.split(s);
for (String b : a) {
System.out.print(b);
}
输出:123456789
Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持,
要想得到更丰富的正则匹配操作,那就需要将Pattern与Matcher联合使用。
Matcher有三个基本都匹配方法:
matches() 用于全字符串匹配
lookingAt() 从字符串最开头开始匹配满足的子串
find() 可以对任意位置字符串匹配 (find(start)可以从start为起始索引值开始向后匹配)
例子:
Pattern p = Pattern.compile("China");
Matcher m1 = p.matcher("China");
Matcher m2 = p.matcher("Hello, China");
Matcher m3 = p.matcher("China, Hello");
System.out.println(m1.matches());// true
System.out.println(m1.lookingAt());// true
System.out.println(m1.find());// false
System.out.println(m2.matches());// false
System.out.println(m2.lookingAt());// false
System.out.println(m2.find());// true
System.out.println(m3.matches());// false
System.out.println(m3.lookingAt());// true
System.out.println(m3.find());// false
如果把m的find()放在每一个m的最开始,则输出都是true。
start() 返回字符串的起始索引
end() 返回字符串的结束索引
group() 返回匹配到的字符串
例子:
Pattern p = Pattern.compile("China");
Matcher m = p.matcher("aaaChinabbb");
m.find();// 一定要加上,不然报错
System.out.println(m.start());// 3
System.out.println(m.end());// 8
System.out.println(m.group());// China
group(int i),groupCount()用于分组操作
例子:
Pattern p = Pattern.compile("(James)(Irving)");
Matcher m = p.matcher("111JamesIrving222"); // 两组要连在一起,不然报错
m.find();// 一定要加上,不然报错
// groupCount是捕获组的数量。捕获组是正则表达式语法中的概念,一个()为一个捕获组。
System.out.println(m.groupCount());// 2
System.out.println(m.group(1));// James
System.out.println(m.group(2));// Irving
两种用于重置当前匹配器的方法:reset()和reset(CharSequence input)
例子:
Pattern p = Pattern.compile("James");
Matcher m = p.matcher("111James222");
m.find();// 一定要加上,不然报错
System.out.println(m.group());// James
m.reset();// 如果没有reset,后面会报错
m.find();
System.out.println(m.group());// James
m.reset("Irving");
System.out.println(m.find());// false
替换全部匹配到的字符串:replaceFirst() 和 replaceAll()
例子:
Pattern p = Pattern.compile("James");
String s = "JamesJames";
Matcher m = p.matcher(s);
System.out.println(m.replaceFirst("Irving"));// IrvingJames
System.out.println(m.replaceAll("Irving"));// IrvingIrving
System.out.println(s);// JamesJames
appendReplacement允许直接将匹配的字符串保存在另一个StringBuffer中并且是渐进式匹配,
并不是只匹配依次或匹配全部,
而appendTail则是将未匹配到的余下的字符串添加到StringBuffer中。
例子:
Pattern p = Pattern.compile("James");
Matcher m = p.matcher("JamesIrving");
m.find();
StringBuffer sb = new StringBuffer();
m.appendReplacement(sb, "Curry");
System.out.println(sb);// Curry
m.appendTail(sb);
System.out.println(sb);// CurryIrving