正則表示式斷言講解 JavaScript版
正則表示式中限制被匹配內容前後是否應該有指定內容的功能,叫做斷言,這裡通過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/
以上就是我對斷言的粗略講解,另外,正則表示式的匹配是很奇妙的,例如上面後行(否定)斷言的兩個例子,你把多斜槓替換成空字串,還是會出現不是你預期的結果,就像正向否定斷言那個例子一樣,想要更深層次的學習,就需要自己思考了。
另外如果內容有錯誤,希望大家指正,謝謝