关于正则中的Pattern和Matcher的使用

关于正则中的Pattern和Matcher的使用

在项目中, 经常需要对请求的数据进行格式,内容校验, 而使用正则表达式, 比较简单优雅实现校验功能. 故记录一下正则中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
        */
    }
}
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值