1.test在全局匹配下,连续的执行会报错,例如:
var reg = /a/g
reg.test('a') //true
reg.test('a') //false
原因是lastIndex
导致出错,但是具体是为啥,我还没搞懂,先留着,以后弄懂了再补上。不过总而言之,test
只是匹配是否存在,没必要用全局g
,不用就是了。
2.贪婪.*
和非贪婪.*?
简单理解就是,尽可能多和尽可能少的匹配。当匹配的值比较长和复杂的时候,有可能会出现重复尾部匹配的情况,非贪婪匹配能更精准的匹配。比如:
'abbb4bbb4'.match(/a.*4/) // ['abbb4bbb4']
'abbb4bbb4'.match(/a.*?4/) // ['abbb4']
3.?:
、?=
和?!
?:
作用是在分组匹配的时候,不占用一个组位。实用性的话,我想了半天也没想出什么地方用比较合适,只能举一个大概会用到的例子。
//匹配家庭号码
'07956533869'.replace(/(\d{3,4})(\d{7,8})/,'$1')
//'0795' 返回的是区号
'07956533869'.replace(/(?:\d{3,4})(\d{7,8})/,'$1')
//'6533869' 返回的是电话号码
?=
和?!
就是在匹配的时候,需要匹配该字符存在或不存在,但是不需要后续的操作
'12px'.match(/\d+(?=px)/) //['12']
'12px 13rem'.match(/\s\d+(?!px)/) //[' 13']
//这个两个规则只能在后面匹配,不能在前面匹配,这我不知道为啥
'12px'.match(/(?=\d)px/) //null
'12px 13px'.match(/(?!\d)px/) //'px'