js使用正则,对前瞻断言和后瞻断言的理解

js使用正则报错?原来是用了 后瞻断言

如果不是遇到这个错误,我可能还是那么无知吧


location.href.match(/(?<=exp)[\/|=|&]?(\d*)/i)

匹配url的id参数,获取到id参数的值

var a = 'http://ydnqytest.suoluomei.cn/index.php?s=/Wechat/Commerce/Commerce/id/23524'
undefined
a.match(/(?<=id)[\/|=|&](\d*)/i)[1]
"23524"
断言写法
前瞻断言

(?=exp) 顺序肯定环视,表示所在位置右侧能够匹配exp

(?!exp) 顺序否定环视,表示所在位置右侧不能匹配exp

后瞻断言

(?<=exp) 逆序肯定环视,表示所在位置左侧能够匹配exp

(?

注:

  • 括号是必须的,写法: (?!=...)

  • 有些语言并不完全支持,比如:javascript的正则并不支持后瞻断言表达式,使用了会报错的。

    • 这里有坑,不要随便用后瞻断言,旧浏览器不支持
  • 其中exp是一个正则表达式可以是子模式,如:(?=((exp))。

  • 环视也称断言;断言是不占用字符串的((?=exp)所以不能引用,exp是占用字符串的)

本人一直对前瞻断言和后瞻断言不怎么分得清,(?=exp) 这个明明是向后匹配,怎么是前瞻呢,奇怪?

今天看了一篇博文 [^1] 有一种恍然大悟的感觉,文本处理是从左往右理解就对了。

下面匹配\W*(?=\.gif) 匹配 .gif 前面的字母,.gif 作为断言匹配,这样不就是 前瞻匹配断言 了吗?

下面再来一个后瞻断言例子,匹配url传递的参数

举例说明

使用方法
(?=exp) 顺序肯定环视,表示所在位置右侧能够匹配exp

来个javascript的例子,匹配.gif的文件名
var s="img.jpg,abc.gif,123.jpeg";
s.match(/\w*(?=\.gif)/);
结果:["abc"]
/\w*(?=\.gif)/中的\w* 表示可以有零个或多个字符,匹配到的是abc,那么(?=.gif)这个匹配到什么?
其实他匹配到的只是一个位置,这就是断言的初衷,匹配到的是介于abc与.gif的位置。 
好吧不信来验证下:
去掉正则表达式的\w*,在匹配到的内容替换成#
var s="img.jpg,abc.gif,123.jpeg";
s.replace(/(?=\.gif)/,"#");
结果:"img.jpg,abc#.gif,123.jpeg"

后瞻断言

用正则匹配url传递的参数

var a = 'http://ydqwytest.suolwei.cn/index.php?s=/Wechat/Commerce/Commerce/id/23524'

a.match(/(?<=id)[\/|=|&](\d*)/i)[1]
"23524"

id 作为断言, 匹配位置,向后匹配数字 后瞻断言

js使用 后瞻断言 有坑

参考: [^1]: https://segmentfault.com/a/1190000006824133

你可能感兴趣的:(JavaScript)