正则表达式中限制被匹配内容前后是否应该有指定内容的功能,叫做断言,这里通过javascript这门语言来举例讲解。
断言的类型分为先行(否定)断言和后行(否定)断言,而在javascript这么语言中,在es2018之前,是不支持后行(否定)断言的,支持后行断言是在es6被提出,在v8的4.9版(chrome62)这点要做低版本浏览器兼容的时候,需要注意。基本就是目前大多数浏览器都不支持,所以慎重使用。
先行断言的意思是,被匹配内容只有在指定字符串前面才能匹配,格式为/被匹配内容(?=后面必须跟的内容)/
例如你要替换掉字符串中数字跟着百分号的部分
var before = "aaa123%ad121dfakm".replace(/\d+(?=%)/g,'');
最终before的内容为aaa%ad121afakm,这里要注意断言部分不会被替换掉哦。
先行否定断言的意思和先行断言正相反,被匹配的内容只有不在指定字符串前面才能被匹配。
还是上面那个例子,你要替换带字符串中不在百分号之前数字
var notbefore = "aaa123%ad121dfakm".replace(/\d{0,}(?!%)/g,'');
然后你就惊奇的发现,卧槽结果notbefore最终是aaa3%addfakm,虽然其他位置的数字被替换掉了,但是123%最终12部分也被替换掉了,怎么办呢?依旧使用后行否定断言进行限制
var notbefore = "aaa123%ad121dfakm".replace(/(\d{0,}(?!%))(?!\d)/g,'');
最终结果为 aaa123%addfakm 这是我们最终想要的格式,至于为什么,根据我上面讲解的先行否定断言内容自己思考下啦。
接下来是后行(否定)断言
后行断言指的是被匹配内容只有在指定内容之后才会被匹配到,格式为/(?<=指定内容)被匹配内容/
这里举一个例子,例如你要替换掉冒号后面的斜杠为单斜杠
var after = 'http://aaa//wrwrw//12323//'.replace(/(?<=:)\/+/g,'/')
这里最终after的结果就是 http:/aaa//wrwrw//12323// 冒号后面的双斜杠被替换成单斜杠了
后行否定断言则正相反,被匹配的内容只有不在指定内容之后才会被匹配到,格式为/(?<!指定内容)被匹配内容/
依旧是上面那个例子,你要替换掉不跟在冒号后面的多斜杠为单斜杠
var notafter = 'http://aaa//wrwrw//12323//'.replace(/(?<!:)\/+/g,'/')
最终notafter的结果为http://aaa/wrwrw/12323/
以上就是我对断言的粗略讲解,另外,正则表达式的匹配是很奇妙的,例如上面后行(否定)断言的两个例子,你把多斜杠替换成空字符串,还是会出现不是你预期的结果,就像正向否定断言那个例子一样,想要更深层次的学习,就需要自己思考了。
另外如果内容有错误,希望大家指正,谢谢