正则贪婪,非贪婪,分组,前瞻
1.贪婪模式
正则是:/\d{3,5}/g,字符串是 12345678
那么exec 方法或者match方法返回的结果是什么呢? 是 [123,456] 还是 [1234,5678] 还是[12345]
答案是:[12345] . 正则表达式默认是贪婪模式,即尽可能多的匹配,如果失败那么减一匹配直到最小值。在这种情况下前面5个数字匹配后,下标来到6处,678不会再匹配
2.非贪婪模式
让正则表达式尽可能少的匹配,也就是说一旦成功匹配就不在继续尝试就是非贪婪模式
只要在量词后加上?即可
'123456789'.match(/\d{3,5}?/g); 返回[123,456,789]
3.分组反向引用
2015-12-25 =》 12/25/2015
可以这样。$n表示对应的分组.如果没有这样的分组那么就会把$n 当成字符串处理
'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1')
栗子:
'a1b2c3d4'.replace(/((\w\d){3})/g,'X$1xx'),返回结果"Xa1b2c3xxd4"
4.忽略分组(只是利用分组,但确不捕获)
不希望捕获某些分组只要在分组内加上?: 就可以
栗子:
'sasdadsssaaaattt'.replace(/(?:sss|ttt)/g,'X$1X')
返回:
"sasdadX$1XaaaaX$1X"
4.前瞻与后顾
1.正则表达式从文本头部向尾部开始解析,这样的解析方向称为'前'
2.前瞻 就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/后瞻 方向相反
3.Javascript 不支持后顾
4.符合和不符合特定断言称为肯定/正向 匹配 和 否定/负向 匹配
5.语法: exp(?=assert) 正向 exp(?!assert) 负向
栗子:
'a1b3c5'.replace(/\w(?=\d)/g,'X0X'),返回:"X0X1X0X3X0X5"。 数字部分并不会被替换
'a1b3c5'.replace(/\w(?!\d)/g,'X0X'),返回: "aX0XbX0XcX0X"。 数字也是字符