正则 常用
★ 以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+)? 匹配一个小数点和多位数字
$ 匹配结尾
浙公网安备 33010602011771号