雪洗中关村

导航

正则 常用

 

 

 ★ 以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 =/\bis\b/gim
    来说说他们有什么作用
    (1.)有g和没有g的区别
        var r1=/\bis\b/
        var r2=/\bis\b/
        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=/\bis\b/g
        var r2=/\bis\b/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})+\b)/g, '$&,')     https://www.cnblogs.com/vinfy2018/p/8469883.html
        1234567890.012.replace(/\d(?=(?:\d{3})+\b)/g, '$&,')

        查找以\d为开头,以\b为结束(即"."的前面,这点我是到最后面才理解到的),中间至少出现一次\d{3}的匹配
        红色是开头\d,灰色是\d{3}+
        第一次匹配到1234567890.012
        第二次匹配到1234567890.012
        第三次匹配到1234567890.012
        然后在匹配到的数字后面加个',',变成1,234,567,890.012
        
        ?=是正向预匹配,即不会让?=后面的内容被匹配出来,这里的作用是不让\d{3}+被替换掉
        ?:是非捕获性匹配,它使匹配不缓存起来,这点我要另起文章写,去掉了也不影响正确结果
        \b是单词分界符,这个才是重点,去掉了会变成1,2,3,4,5,6,7,890.012
        
        因为少了\b限定,它不会以"."作结束标志,试理解下\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
        把\b换成\.也是可行的

 

 

 

 

 

 

 

 

 /=\s*\".*?\"/g  表示什么意思?  https://www.cnblogs.com/wanshutao/p/3518406.html
        \s 是空白  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\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+)?     匹配一个小数点和多位数字
        $             匹配结尾     

 

posted on 2018-12-13 11:26  雪洗中关村  阅读(187)  评论(0)    收藏  举报