正则表达式没那么难

Posted wangjunling888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式没那么难相关的知识,希望对你有一定的参考价值。

正则表达式没那么难

  1. [] 表示一位字符

    • [a] 表示字母a

      String regex = "[a]"
      
      System.out.println("a".matches(regex));//true
      
      System.out.println("aa".matches(regex));//false
      
      System.out.println("b".matches(regex)); //false
      
    • [abc] 表示包含abc中任意一位

      String regex = "[a]"
      
      System.out.println("a".matches(regex));//true
      
      System.out.println("aa".matches(regex));//false
      
      System.out.println("b".matches(regex)); //true
  2. ^为取非

    • [^a] 表示非a的字母

      String regex = "[^a]";
      
      System.out.println("a".matches(regex));//false
      
      System.out.println("aa".matches(regex));//false, 两位了,
      
      System.out.println("b".matches(regex)); //true
  3. -为区间连接符, 两头表示范围

    • a-z表示从a到z, 0-9 表示从0到9 A-Z表示A到Z

    • String regex = "[0-9]";
      
      System.out.println("a".matches(regex));//false
      
      System.out.println("1".matches(regex));//true
      
  4. . 表示任意字符

  5. 量词 ?, *, + m,n

    • ? 附加到某一位后面表示当前位出现一次或者一次也没有, 次数<=1

      String regex = "[0-9]?";
      
      System.out.println("1".matches(regex));//true
      System.out.println("".matches(regex));//true
      System.out.println("a".matches(regex));//false, 注意这个不算没出现
    • *表示出现次数大于等于0 次数>=0

      String regex = "[0-9]*";
      System.out.println("1".matches(regex));//true
      System.out.println("123".matches(regex));//true
      System.out.println("".matches(regex));//true
      System.out.println("a".matches(regex));//false, 注意这个不算没出现
    • +表示出现次数大于等于1 次数>=1

      String regex = "[0-9]+";
      System.out.println("1".matches(regex));//true
      System.out.println("123".matches(regex));//true
      System.out.println("".matches(regex));//false
      System.out.println("a".matches(regex));//false, 注意这个不算没出现
    • m, n

      String regex = "[0-9]3,5";
      System.out.println("1".matches(regex));//false
      System.out.println("12".matches(regex));//false
      System.out.println("123".matches(regex));//true
      System.out.println("12345".matches(regex));//true
      System.out.println("123456".matches(regex));//false
      
      //注意空号中参数可以使用一个,n表示有且仅有n个
      String regex = "[0-9]3,5";
      System.out.println("12".matches(regex));//false
      System.out.println("123".matches(regex));//true
      System.out.println("12345".matches(regex));//false
      
      //n,表示大于等于n
      String regex = "[0-9]3";
      System.out.println("12".matches(regex));//false
      System.out.println("123".matches(regex));//true
      System.out.println("12345".matches(regex));//true
      
  6. 常用字符标识

    • \\d 表示0-9之间的数组相当于[0-9], \\D表示非数字

      String regex = "\\\\d"; //第一个\\为转义字符
      System.out.println("1".matches(regex));//true
      System.out.println("a".matches(regex));//false
      
      String regex = "\\\\D"; //第一个\\为转义字符
      System.out.println("1".matches(regex));//false
      System.out.println("a".matches(regex));//true
    • \\s 表示空白字符相当于 [ \\t\\n\\x0B\\f\\r], 可以理解为看不到的都算是空白字符 \\S相当于对\\s取反

    • String regex = "\\\\s"; //第一个\\为转义字符
      //空格
      System.out.println(" ".matches(regex));//true
      //回车
      System.out.println("\\r".matches(regex));//true
      //换行
      System.out.println("\\n".matches(regex));//true
      //无字符
      System.out.println("".matches(regex));//false
      System.out.println("a".matches(regex));//false
    • \\w表示单词字符, 所有大小写字母,数字和下划线相当于[a-zA-Z_0-9], \\W相当于\\w取反

      String regex = "\\\\w"; //第一个\\为转义字符
      //空格
      System.out.println(" ".matches(regex));//false
      //回车
      System.out.println("\\r".matches(regex));//false
      System.out.println("a".matches(regex));//true
      System.out.println("1".matches(regex));//true
      System.out.println("_".matches(regex));//true
      System.out.println("#".matches(regex));//false
  7. 分组, 正则表达式中用()表示小组, 可以通过计算开括号来编号, 分好的组可以通过编号替代,第0组代表整个表达式,先看代码吧

    • String regex = "(h((a)(b)))\\\\1\\\\2\\\\3\\\\4";
      
      System.out.println("habhababab".matches(regex));//true

    解释上面的规则:

    首先表达式前面(h((a)(b)))表示 一个h, 一个a,一个b如果没有后面的数组部分怎 匹配记过就是 hab, 后面的数组\\\\n表示组数, 组数的规律是从左往右找开括号, 按照分组规律可以将表达式分为下面四组

    • 第一组 (h((a)(b))) 从第一个开括号开始到对应的闭括号结束
    • 第二组 ((a)(b)) 从第二个开括号开始, 到第二个闭括号结束
    • 第三组 (a)
    • 第四组 (b)

    所以对应的结果habhababab应该是 hab hab(第一组) ab(第二组) a(第三组)b(第四组)

至此, 正则的基本语法基本完毕, 下面来两个小练习,

  1. 用户名要求6-16位数字字母或下划线

    "\\w6,16"
  2. 匹配出叠词

    "(.)\\\\1(.)\\\\2
  3. 匹配指定位数qq号码

    //6-9位数的qq号码
    "\\d6,9"

好了今天的学习总结就到这里, 感兴趣的朋友可以参看这里 菜鸟教程 虽然有点像w3c但是感觉这个网站提供的小工具还是挺好用的, 鉴于笔者学疏才浅如有错误请在评论区指出, 以便互相促进技术的提升!!!

以上是关于正则表达式没那么难的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式的规则

java正则表达式-量词

java正则表达式-量词

正则表达式量词

正则表达式之量词

这两个正则表达式有啥区别? (理解?量词)