zoukankan      html  css  js  c++  java
  • 正则 常用

     ★ 以1-8开头的六位数字 : /^[1-8][0-9]{5}$/

    日期相关正则:

    ("\d{4}[年|\-|\.]\d[1-12][月|\-|\.]\d[1-31]日?")               //缺陷:不支持YYYYmmdd
    ("\d{4}(-|\/)((0[1-9])|(1[0-2]))(-|\/)((0[1-9])|([1-2][0-9])|(3[0-1]))")  //缺陷:不支持YYYYmmdd
    ("(?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)")       
    ("([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))")     官方版

    参考:
    https://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html
    https://blog.csdn.net/lxcnn/article/details/4362500
    https://baijiahao.baidu.com/s?id=1588848792548192879&wfr=spider&for=pc

    //匹配日期,支持闰年,格式为YYYYMMDD

    ([d]{4}(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-8])))))|((((([02468][048])|([13579][26]))00)|([0-9]{2}(([02468][048])|([13579][26]))))(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-9])))))
    原文:https://blog.csdn.net/lu188887/article/details/7421857 

    日期解析格式作为参数时校验

    ^y{4}\-M{2}\-d{2}$|^y{4}\/M{2}\/d{2}$|^y{4}\.M{2}\.d{2}$|^y{4}M{2}d{2}$|^y{4}年M{2}月d{2}日$

     

    2 : 表示第一部分向后引用:

        例如,日期可以写为2000/12/03或2004-12-03,但写成2004/12-03或2004-12/03就不好了

        所以用/^(d{4})([-/])(d{1,2})2(d{1,2})$/来匹配,里面的2就是([-/])的向后引用了

       ()就是分组,1,$1指第一个分组,2,$2指第二个分组。(官方:'1'和'$1'都是用来指定 【第一个子匹配】)

       [^x] 匹配除了x以外的任意字符
       [^abc] 匹配除了abc这几个字母以外的任意字符

    常用正则解析:

    ★1 修饰符 (三个 g i m)
        修饰符与其他语法特殊,字面量方法声名的时候放到//后,构造函数声明的时候,作为第二个参数传入。整个正则表达式可以理解为正则表达式规则字符串+修饰符
        g:global 执行一个全局匹配
        i:ignore case执行一个不区分大小写的匹配
        m: multiple lines多行匹配
        修饰符可以一起用 const reg =/is/gim
        来说说他们有什么作用
        (1.)有g和没有g的区别
            var r1=/is/
            var r2=/is/
            var v='he is a boy. This is a dog. Where is she?';
            v.repalce(r1, 'iss'); // 'he iss a boy. This is a dog. Where is she?'     //替换head部分片段
            v.repalce(r2, 'iss'); // 'he iss a boy. This iss a dog. Where iss she?' //替换全局片段
        1.)有g和没有g的区别
            var r1=/is/g
            var r2=/is/gi
            var v='he is a boy. Is she?';
            v.repalce(r1, 'iss'); // 'he iss a boy. Is  she?'
            v.repalce(r2, 'iss'); // 'he iss a boy. Iss she?'  
        

    ★  以......开头的的问题

     /^d{4}[/-]d{2}[/-]d{2}$/ :
        注意 [/-] :中间的两个字符是或的关系!
        System.out.println("-98- "+ Pattern.compile("^(\d{4})[/-](\d{2})[/-](\d{2})$").matcher("2000-11-22").matches() ); //匹配必须以4为数字开头的 YYY-mm-dd 格式的字符串
        System.out.println("-97- "+ Pattern.compile("^ (\d{4}[/-](\d{2})[/-](\d{2}) )[\.]").matcher("2000-11-22.").matches()); //匹配必须以YYYY-mm-dd格式开头的字符串(^用于长串字符)
        
     /^(-?d+)(.d+)?$/
            这个正则就是匹配数字;
            -?表示前面可以有一个可选的减号;
            d+表示一到多个数字,(-?d+)这个表示整数部分;
            (.d+)?表示一个小数点跟多个数字,?表示前面这部分是可选的,这部分匹配一个可选的 小数部分;

    ★  千位符正则解析:

                   replace( /d(?=(?:d{3})+)/g, '$&,')     https://www.cnblogs.com/vinfy2018/p/8469883.html
            1234567890.012.replace(/d(?=(?:d{3})+)/g, '$&,')
    
            查找以d为开头,以为结束(即"."的前面,这点我是到最后面才理解到的),中间至少出现一次d{3}的匹配
            红色是开头d,灰色是d{3}+
            第一次匹配到1234567890.012
            第二次匹配到1234567890.012
            第三次匹配到1234567890.012
            然后在匹配到的数字后面加个',',变成1,234,567,890.012
            
            ?=是正向预匹配,即不会让?=后面的内容被匹配出来,这里的作用是不让d{3}+被替换掉
            ?:是非捕获性匹配,它使匹配不缓存起来,这点我要另起文章写,去掉了也不影响正确结果
            是单词分界符,这个才是重点,去掉了会变成1,2,3,4,5,6,7,890.012
            
            因为少了限定,它不会以"."作结束标志,试理解下d(?=d{3}+),只要满足开头有一个d后面至少有一个d{3},它会这样匹配:
            第一次:1234567890.012
            第二次:1234567890.012
            第三次:1234567890.012
            第四次:1234567890.012
            第五次:1234567890.012
            第六次:1234567890.012
            第七次:1234567890.012
            然后在匹配到的数字后面加个',',变成1,2,3,4,5,6,7,890.012
            把换成.也是可行的
     /=s*".*?"/g  表示什么意思?  https://www.cnblogs.com/wanshutao/p/3518406.html
            s 是空白  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f
    
    	v]。
            ?  表示0次或者一次
            *  表示0个或多个 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
            g  表示全局
            总结:匹配以=开关,后面是0或多个空格,然后是双引号括起来的任意字符
            这个正则 意思是匹配         等号    空格任意个    引号       任意字符0次或多次    引号     /g  意思是全局匹配    用在js 中 有类似  replaceAll()  的这个效果。
    ★  /^-?(?:d+|d{1,3}(?:,d{3})+)(?:.d+)?$/ 
        /^-?  :d+|d{1,3}(?:,d{3})+)(?:.d+)?$/
            ^ #匹配字符串开头
            -?            表示减号是可选的,可以没有
            d+            匹配任意位的数字
            |              表示‘或’关系
            d{1,3}     匹配1-3位数字
            :,d{3})+      匹配一个逗号加一个3位数字,+号表示可以重复多个
            :.d+)?     匹配一个小数点和多位数字
            $             匹配结尾     
  • 相关阅读:
    JS数组存储(两个数组相等,一个改变,另一个跟着改变)
    图片404加载失败后如何处理
    为什么重写equals方法,还必须要重写hashcode方法
    Java中HashMap和TreeMap的区别深入理解
    java中String数组和List的互相转化
    log4j重复打印的解决方法
    mysql 允许在唯一索引的字段中出现多个null值
    elasticsearch 常见查询及聚合的JAVA API
    A记录(主机名解析)、CNAME(别名解析)和URL转发(域名转发)
    域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别
  • 原文地址:https://www.cnblogs.com/hahajava/p/10112996.html
Copyright © 2011-2022 走看看