文章目录
前言
我上一篇写了正则表达式的总结,这一篇讲一下Java中Pattern和Matcher类的使用。
正则表达式总结请移步:【正则表达式】(0)总结
大纲
Pattern :正则表达式的编译表示形式。
主要就是用来写正则表达式。
public final class Patternextends Object implements Serializable
Matcher 通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
看名字也知道了,匹配器主要用来匹配。
public final class Matcher extends Object implements MatchResult
二、使用
1.字段(Pattern类)
int caseInsensitive = Pattern.CASE_INSENSITIVE; // 忽视大小写,使用Pattern的compile(String regex, int flags) 方法时使用。
2.构造器(Pattern类和Matcher类)
Pattern类和Matcher类都没有构造器。
Pattern类有静态方法,直接调用静态方法即可。
Matcher对象是通过Pattern类的matcher(CharSequence input) 进行创建的。可以看下面 3.5创建匹配器
3.常用方法(Pattern类)
3.1 创建正则编译到模式中
将给定的正则表达式编译到模式中。
- compile(String regex)
- 也就是创建一个正则表达式。
private static Pattern c = Pattern.compile("[a-z]+"); // 创建正则表达式编译到模式中
3.2 创建正则编译到模式中并给定标志
将给定的正则表达式编译到具有给定标志的模式中。
- compile(String regex, int flags)
- 也就是创建一个正则表达式。同时给定一个标志,如:忽视大小写。
private static Pattern c = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
3.3 模式的字符串形式
返回匹配器的字符串表示形式。
- toString()
- 返回模式的字符串形式,也就是正则。
/** 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度 */
private static Pattern p = Pattern.compile("[a-z]+");
public static void main(String[] args) {
String s = p.toString();
System.out.println(s); // [a-z]+
}
3.4 字符串匹配
编译给定正则表达式并尝试将给定输入与其匹配。
- matches(String regex, CharSequence input)
- 就是给一个字符串形式的正则表达式,同时给一个需要判断是否匹配的字符串。匹配时返回true,不匹配返回false
boolean m = Pattern.matches("[a-z]+", "hello");
System.out.println(m); // true
boolean m2 = Pattern.matches("[a-z]+", "123");
System.out.println(m2); // false
3.5 创建匹配器
创建匹配给定输入与此模式的匹配器。
- matcher(CharSequence input)
- 创建一个匹配器,同时给定需要匹配器匹配的字符。
/** 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度 */
private static Pattern p = Pattern.compile("[a-z]+");
public static void main(String[] args) {
Matcher hello = p.matcher("hello"); // 获取到一个匹配器
}
4.常用方法(Matcher类)
4.1 字符串匹配
尝试将整个区域与模式匹配。
- matches()
- 同上面 3.1 字符串匹配 一样。
只不过3.1调用的是Pattern的静态方法matches(),而这里调用的是Matcher对象的matches方法。
/** 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度 */
private static Pattern p = Pattern.compile("[a-z]+");
public static void main(String[] args) {
Matcher matcher = p.matcher("hello");
boolean m = matcher.matches();
System.out.println(m); // true
Matcher matcher2 = p.matcher("hello 123");
boolean m2 = matcher2.matches();
System.out.println(m2); // false
}
4.2 捕获组数量
返回此匹配器模式中的捕获组数。
- group(int group)
- 正则表达式中,正则表达式会左侧开始,每出现一个左括号"("记做第1个组,以此类推。
private static Pattern p = Pattern.compile("(([a-z]).)");
public static void main(String[] args) {
Matcher matcher = p.matcher("a-b-c-d-e-");
int count = matcher.groupCount();
System.out.println(count);
}
4.3 正则替换
- replaceFirst(String replacement)
- 替换第一个匹配的字符串
- replaceAll(String replacement)
- 替换所有匹配的字符串
private static Pattern p = Pattern.compile("(([a-z]).)");
public static void main(String[] args) {
Matcher matcher = p.matcher("a-b-c-d-e-");
String s = matcher.replaceFirst("z-"); // 替换第一个匹配的字符串
System.out.println(s); // z-b-c-d-e-
String all = matcher.replaceAll("z-"); // 替换所有匹配的字符串
System.out.println(all); // z-z-z-z-z-
}
4.4 查找获取匹配
尝试查找与该模式匹配的输入序列的下一个子序列。
- find()
- 尝试匹配下一个匹配的字符串,就是查找字符串中匹配的子字符串
返回由以前匹配操作所匹配的输入子序列。
- group()
- 返回之前匹配的子字符串,就是获取字符串中匹配的子字符串
/** 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度 */
private static Pattern p = Pattern.compile("[a-z].");
public static void main(String[] args) {
Matcher matcher = p.matcher("a-b-c-d-e-");
// 一个个匹配
boolean f = matcher.find();
String g = matcher.group();
System.out.println("是否有匹配的子字符串:"+f+"\n匹配的结果为:"+g);
// 循环匹配
while (matcher.find()) {
String group = matcher.group();
System.out.println(group);
}
}