美文网首页
正则表达式没那么难

正则表达式没那么难

作者: 崇山峻岭 | 来源:发表于2018-08-06 19:50 被阅读12次
    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
        
    1. ^为取非

      • [^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
        
    2. -为区间连接符, 两头表示范围

      • 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
        
        
    3. . 表示任意字符

    4. 量词 ?, *, + {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
        
        
    5. 常用字符标识

      • \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
        
    6. 分组, 正则表达式中用()表示小组, 可以通过计算开括号来编号, 分好的组可以通过编号替代,第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位数字字母或下划线

      "\w{6,16}"
      
    2. 匹配出叠词

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

      //6-9位数的qq号码
      "\d{6,9}"
      

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

    相关文章

      网友评论

          本文标题:正则表达式没那么难

          本文链接:https://www.haomeiwen.com/subject/dvagvftx.html