在项目中, 经常需要对请求的数据进行格式,内容校验, 而使用正则表达式, 比较简单优雅实现校验功能. 故记录一下正则中Pattern和Matcher的使用.
1 简介
java.util.regex包下的Pattern和Matcher都是Java中用于正则表达式匹配的类. Pattern是表示一个正则表达式, Matcher表示一个字符串通过正则表达式匹配的部分, 主要用来对字符串进行查询匹配和替换.
即Pattern主要是将正则表达式编译生成一个Pattern对象. 而Matcher主要是将Pattern对象和待校验的字符串进行匹配操作.
2 语法
Pattern类
public class Pattern {
// 静态方法 创建Pattern对象 构造私有不能直接创建
public static Pattern compile(String regex);
// 用于分隔字符串,并返回一个String[]
public String[] split(CharSequence input);
// 静态方法 快速匹配字符串,只匹配一次,匹配全部字符串
public static boolean matches(String regex, CharSequence input);
// 创建Matcher 构造缺省, 外面不可直接创建
public Matcher matcher(CharSequence input);
}
Matcher类
public class Matcher {
// 对整个字符串进行匹配,所有字符串都匹配了 才返回true
public boolean matches();
// 对字符串进行匹配,匹配到字符串 就返回true
public boolean find();
// 对最前面的字符串进行匹配,即匹配到的字符串在最前面才返回true
public boolean lookingAt();
// 返回匹配到的子字符串
public String group();
// 返回匹配到的子字符串在字符串中的索引位置
public int start();
// 返回匹配到的子字符串的最后一个字符在字符串中的索引位置
public int end();
// 返回有多少组
public int groupCount();
// group()重载方法 获取分组后的数据
public String group(int group);
// start()重载方法 获取分组后的数据
public int start(int group);
// end()重载方法 获取分组后的数据
public int end(int group);
}
3 案例
public class MyPatternDemo {
private static Pattern NUMBER_PATTERN = Pattern.compile("\\d+");
private static Pattern NUMBER_PATTERN2 = Pattern.compile("用电时间:(..-..)_(..-..),电费:(\\d*\\.?\\d*)");
public static void main(String[] args) {
String str1 = "abcd12345678";
// Pattern方法
// split [abcd]
System.out.println(Arrays.toString(NUMBER_PATTERN.split(str1)));
// matches true
System.out.println(Pattern.matches("\\d", "1"));
// matcher
Matcher matcher = NUMBER_PATTERN.matcher(str1);
System.out.println("------------------------");
// Matcher方法
String str2 = "abcd12345678";
String str3 = "12345678";
Matcher matcher2 = NUMBER_PATTERN.matcher(str2);
Matcher matcher3 = NUMBER_PATTERN.matcher(str3);
// matches
System.out.println(matcher2.matches());
System.out.println(matcher3.matches());
System.out.println("------------------------");
// 结果 false true
// find
String str4 = "abcd123";
String str5 = "123";
Matcher matcher4 = NUMBER_PATTERN.matcher(str4);
Matcher matcher5 = NUMBER_PATTERN.matcher(str5);
System.out.println(str4 + matcher4.find());
System.out.println(str5 + matcher5.find());
System.out.println("------------------------");
// 结果 true true
// lookingAt
System.out.println(matcher2.lookingAt());
System.out.println(matcher3.lookingAt());
System.out.println("=======================");
// 结果 false true
// group start end
String str6 = "222";
Matcher matcher6 = NUMBER_PATTERN.matcher(str6);
// 匹配整个字符串
matcher6.matches();
// 222 0 2
System.out.println(matcher6.group());
System.out.println(matcher6.start());
System.out.println(matcher6.end());
System.out.println("========分割线=============");
String str7 = "222aaa333";
Matcher matcher7 = NUMBER_PATTERN.matcher(str7);
while(matcher7.find()) {
System.out.println(matcher7.group());
System.out.print("start:"+matcher7.start());
System.out.println(" end:"+matcher7.end());
}
/*
222
start:0 end:3
333
start:6 end:9
*/
String str = "用电时间:02-01_03-01,电费:130.0";
Matcher matcher8 = NUMBER_PATTERN2.matcher(str);
while(matcher8.find()){
System.out.println("matcher.group(0) "+matcher8.group(0));//得到第0组——整个匹配
System.out.println("matcher.group(1) "+matcher8.group(1));//得到第一组与第一个括号中对应中值匹配
System.out.println("matcher.group(2) "+matcher8.group(2));//得到第二组与第二个括号中对应中值匹配
System.out.println("matcher.group(3) "+matcher8.group(3));//得到第三组与第三个括号中对应中值匹配
}
/*
matcher.group(0) 用电时间:02-01_03-01,电费:130.0
matcher.group(1) 02-01
matcher.group(2) 03-01
matcher.group(3) 70.0
*/
}
}