关于正则中的Pattern和Matcher的使用
- 1 简介
- 2 语法
- 3 案例
在项目中, 经常需要对请求的数据进行格式,内容校验, 而使用正则表达式, 比较简单优雅实现校验功能. 故记录一下正则中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 {// 对整个字符串进行匹配,所有字符串都匹配了 才返回truepublic boolean matches();// 对字符串进行匹配,匹配到字符串 就返回truepublic boolean find();// 对最前面的字符串进行匹配,即匹配到的字符串在最前面才返回truepublic 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 trueSystem.out.println(Pattern.matches("\\d", "1"));// matcherMatcher 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);// matchesSystem.out.println(matcher2.matches());System.out.println(matcher3.matches());System.out.println("------------------------");// 结果 false true// findString 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// lookingAtSystem.out.println(matcher2.lookingAt());System.out.println(matcher3.lookingAt());System.out.println("=======================");// 结果 false true// group start endString str6 = "222";Matcher matcher6 = NUMBER_PATTERN.matcher(str6);// 匹配整个字符串matcher6.matches();// 222 0 2System.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());}/*222start:0 end:3333start: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.0matcher.group(1) 02-01matcher.group(2) 03-01matcher.group(3) 70.0*/}
}