★ 以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+)? 匹配一个小数点和多位数字 $ 匹配结尾