正则 常用

 ★ 以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+)?     匹配一个小数点和多位数字
        $             匹配结尾     
原文地址:https://www.cnblogs.com/hahajava/p/10112996.html