• 正则表达式


    Java版

    Java提供了两个类用来进行正则表达式的匹配

    Pattern Matcher 两个类都没有公共的构造方法,只能通过静态方法创建对象。

     

    限定符:及规定匹配字符的个数,比如?,+,*,{n},{n,}{n,m}等,默认只匹配一次

    贪婪:默认匹配的都是可能长的字符

    非贪婪:?当次字符紧随其他限定符时,都是尽可能匹配短的字符串

     

     

    通过Pattern.compile(regex).matcher(input) 返回的pattern实例的matcher方法构造Matcher对象。

     

     

    Matcher对象匹配结果查询

    find() 如果匹配有结果,返回真,没有匹配到,返回假。查找下一个匹配的结果,要在循环中查找到全部的结果。

    find(int start) 重置匹配器,从在原子符start开始进行匹配。

    start() 返回匹配到的第一项的在原子符的偏移量。

    end() 返回匹配到的最后一项在原子符的偏移量+1。

     

    group() 返回得到的匹配结果,从substring(start(),end()) 得到的结果相同

     

    find()在循环中迭代得到全部的匹配结果 从 end()-start() 可以得知每次匹配到字符的长度

     

    String pattern1="[A-Za-z]";
       Pattern pattern= Pattern.compile(pattern1);
       String input="345rf4";
       Matcher matcher=pattern.matcher(input);

       while (matcher.find()){
           System.out.println("start:"+matcher.start());
           System.out.println("end:"+matcher.end());
           System.out.println("length:"+(matcher.end()-matcher.start()));
           System.out.println("matcher: "+input.substring(matcher.start(),matcher.end()));
           System.out.println("group: "+matcher.group());

      }
    }
    /*
    start:3
    end:4
    length:1
    matcher: r
    group: r
    start:4
    end:5
    length:1
    matcher: f
    group: f
    */

     

    matches() 尝试将整个input字符与正则表达式匹配,如果匹配成功返回真,否则返回假。

    String pattern1="[A-Za-z]{1,}";
    Pattern pattern= Pattern.compile(pattern1);
    String input="rfg";
    Matcher matcher=pattern.matcher(input);
    boolean f= matcher.matches();  //rfg与整个正则表达式匹配,能匹配成功,如果是匹配rfg34 不能匹配成功,因为有数字34不能与正则表达式匹配,返回假
    System.out.println(f);

     

    mathes() 与find() 的区别,是find逐步查找input字符串符合正则表达式的部分。

     

     

    正则表达式中的 [] 和 ()的区别:

    [a-z] 是范围匹配,匹配a-z的任意一个字符

    (a-z) 是全部匹配,匹配的是a-z的全部字符,匹配一个连续的子串

     

    int groupCount() 返回一共的匹配组

    string group(int group) 返回第几个匹配分组的结果,如果没有返回null,从第1个分组开始,第0个是一个特殊的分组,它代表整个表达式,所以它每次都有返回结果。

     

    捕获组,正则表达式regex中使用括号()包囊起来的分组,捕获组是从左到右开始计算其开括号来编号的。

    例如:((A)(B(C))),一共有4个分组,从0-3分别是

    1:((A)(B(C))) ; 2:(A) ; 3: (B(C)) ; 4:(C)

     

    String pattern1="(a)|(A)";
    Pattern pattern= Pattern.compile(pattern1);
    String input="aarAfg45";
    Matcher matcher=pattern.matcher(input);

    while (matcher.find()){
       
       System.out.println("matcher: "+input.substring(matcher.start(),matcher.end()));
       System.out.println("group: "+matcher.group(0));
       System.out.println("第1个分组(a):"+matcher.group(1));
       System.out.println("第2个分组(A):"+matcher.group(2));

    }
    /*
    matcher: a
    group: a
    第1个分组(a):a
    第2个分组(A):null
    matcher: a
    group: a
    第1个分组(a):a
    第2个分组(A):null
    matcher: A
    group: A
    第1个分组(a):null
    第2个分组(A):A
    2

    */

     

    替换

    String pattern1="(a)|(A)";
    Pattern pattern= Pattern.compile(pattern1);
    String input="aarAfg45";
    Matcher matcher=pattern.matcher(input);
    System.out.println(input);
    String s=matcher.replaceAll("&");
    System.out.println(s);
    String s1=matcher.replaceFirst("&");
    System.out.println(s1);
    /*
    原来的=aarAfg45
    s=&&r&fg45
    s1=&arAfg45
    */

     

     

    PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。

     

    字符串的替换,切割,匹配等方法都是基于正则匹配。

    字符串的mathes方法是全局匹配,底层是使用Matcher对象的matches方法,而不是find方法。

     

     

  • 相关阅读:
    软件测试
    python学习之路
    好用的在线画图工具processon
    spring-boot集成dubbo
    公众号开放,关注软件开发过程中的哪些坑
    crontab 中curl命令无法正常执行
    近一月翻阅资料小结
    nginx+tomat8负载后,利用redis实现tomcat8的session共享
    centos7 安装nginx
    centos 上安装redis 3.0.5
  • 原文地址:https://www.cnblogs.com/lin7155/p/13864379.html
Copyright © 2020-2023  润新知