正则表达式有个前瞻的概念,分为:
1、正向前瞻(?=)
=就是肯定的意思。
英文:look ahead positive
2、负向前瞻(?!)
!就是非,否定的意思。
英文:look ahead negative
从字面上看并不好理解,其实这是翻译的问题,我们从英文字面上更好理解。
look ahead就是昂首挺胸向前走路,这个前,就是从左到右。
positive就是肯定,表示你往前走肯定能看到的东西;相反,negative就是否定,就是你往前走看不到的东西。
举个例子,比如有这么一个字符串:
var str = 'hello123jerry'
我们从左到右看(昂首往前走路),hello能看到123吗?
当然肯定看到123了啊,所以我们顺利匹配到了,这就是正向前瞻:
var str= 'hello123jerry'
var reg1 = /hello(?=123)/g
console.log(str.match(reg1))//[ 'hello' ]
我们继续。
hello123继续往前走,不能看到tom吧?(我们怕遇到tom)
放心,前方是jerry,这就是负向前瞻:
var str = 'hello123jerry'
var reg2 = /hello123(?!tom)/g
console.log(str.match(reg2))//[ 'hello123' ]
综合起来,也就是hello要遇到123,但不能遇到tom:
var str = 'hello123jerry'
var reg3 = /hello(?=123)(?!tom)/g
console.log(str.match(reg3))
我们注意到,前瞻并不捕获,只是告诉你:前面有啥捏?
弄懂了基本语义,我们看个比较常见的例子。
金额加千分位间隔:
这个需求大家不陌生吧?实现的方法很多,不过使用正向前瞻是最省事的:
var num = 13123903243
//第一步:将num转为string类型
var str3 = num.toString()//先转换到字符串
//正向前瞻:(\d)往前走,前面是3的倍数,
//\d{3}表示3位数字,
///d{3}+表示3的倍数
var handleNum = str3.replace(/(\d)(?=(\d{3})+$)/g,function(val){
return val+','
})
console.log(handleNum)
运行过程:
run.png
其实,正则表达式除了前瞻,还有后顾。但因为js并不支持,我们这里就省略了,有兴趣的同学可以自行百度一下。
网友评论