java正则表达式Pattern和Matcher
Pattern和Matcher
java.util.regex 包(处理正则表达式) 提供了两个用来处理正则表达式的工具类:Pattern和Matcher。Pattern用于建立待匹配的正则表达式模型,Matcher用于在匹配完成后对匹配结果进行相应操作。
1.Pattern
1.1.Pattern.pattern()
返回正则表达式的字符串形式
Pattern p=Pattern.compile("\\w+");
p.pattern(); //返回 \w+
1.2.Pattern.split(CharSequence input)
该方法用于分割字符串,并返回一个String[]
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com");
运行结果:
str[0]="我的QQ是:", str[1]="我的电话是:", str[2]="我的邮箱是:aaa@aaa.com"
1.3.Pattern.matchers(String regex,CharSequence input)
该方法是一个静态方法,用于快速匹配字符串,该方法将会匹配全部字符串
Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到
2.Matcher
Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false。
2.1.Matcher.matches()
matches()方法匹配的是整个字符串
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.matches();//返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
Matcher m2=p.matcher("2223");
m2.matches();//返回true,因为\d+匹配到了整个字符串
2.2.Matcher.lookingAt()
lookingAt()对最前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true.
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.lookingAt();//返回true,因为\d+匹配到了前面的22
Matcher m2=p.matcher("aa2223");
m2.lookingAt();//返回false,因为\d+不能匹配前面的aa
2.3.Matcher.find()
对指定的字符串进行匹配,匹配到的字符串可以在任意位置。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.find();//返回true
Matcher m2=p.matcher("aa2223");
m2.find();//返回true
Matcher m3=p.matcher("aa2223bb");
m3.find();//返回true
Matcher m4=p.matcher("aabb");
m4.find();//返回false
2.4.Matcher.start()
返回匹配到的子字符串在字符串中的起始位置。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.start();//返回3
2.5.Matcher.end()
返回匹配到的子字符串的最后一个字符的下一个索引值。注意!是下一个索引值,而不是该子字符串中最后一个字符的索引值!
2.6.Matcher.group()
group即返回匹配到的字符串。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.group();//返回2223
2.7.Matcher.start(int, i), Matcher.end(int, i), Matcher.group(int, i), Matcher.groupCount()
前三个API主要用于分组操作,取出第i组数据的索引值,groupCount()则用来返回一共匹配到多少组
Pattern p=Pattern.compile("([a-z]+)(\\d+)"); //()表示分组,意义是括号内是一个整体
Matcher m=p.matcher("aaa2223bb");
m.find(); //匹配aaa2223
m.groupCount(); //返回2,因为有2组
m.start(1); //返回0 返回第一组匹配到的子字符串在字符串中的索引号
m.start(2); //返回3 返回第二组匹配到的子字符串在字符串中的索引号
m.end(1); //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置.
m.end(2); //返回7 返回第二组匹配到的子字符串的最后一个字符在字符串中的索引位置.
m.group(1); //返回aaa,返回第一组匹配到的子字符串
m.group(2); //返回2223,返回第二组匹配到的子字符串
使用正则表达式提取一段文本中的数字
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com");
while(m.find()) {
System.out.println(m.group());
}
运行结果:
456456
0532214
123
如果将while循环替换成
while(m.find()) {
System.out.println(m.group());
System.out.print("start:"+m.start());
System.out.println(" end:"+m.end());
}
则输出:
456456
start:6 end:12
0532214
start:19 end:26
123
start:36 end:39
注意!只有当匹配成功后,才可以使用start(), end(), group()方法,否则会抛出java.lang.IllegalStateException。
也就是说,当matchers(), lookingAt(), find() 其中一个方法返回true时,才可以使用start(),end(),group()方法。