不得不說,老姚的小冊寫的特別好,使我半天基本上就掌握了正則。es6
可是使用過程當中發現了兩點問題正則表達式
要匹配的數據:api
__*數據*__
_**據數**_
***aaa***
複製代碼
我遇到了如上狀況,在學習老姚的小冊後,寫出瞭如下正則bash
/(?:(\*)(\*)(\*)|(_)(\*)(\*)|(\*)(_)(_))[^\*\_]+\3\2\1/
複製代碼
問題在於,分組括號的序列「\1」、「\2」、「\3」究竟是運行時仍是編譯時決定的?學習
若是是運行時會形成匹配或邏輯第一個狀況後才決定序列號,最後以上表達式是成立的,但這是理想的測試
通過測試是編譯就決定了,因此上述表達式是錯誤的spa
因此最後我把表達式修改爲瞭如下:code
/(?:(_)(\*)(\*)[^\*_]+\3\2\1)|(?:(_)(_)(_)[^\*_]+\6\5\4)|(?:(\*)(_)(_)[^\*_]+\9\8\7)/
複製代碼
要匹配的數據it
/home/.../module1/index.js
/home/.../module2/index.js
/home/.../aaa/index.js
複製代碼
我想拿到「module1」、「module2」、「aaa」,怎麼拿編譯
你們的第一反應確定是split('/')+[length-2]或者其餘api組合,可是正則徹底能夠勝任。
/(?<=(\\|\/))[^\\/]+(?=((\\|\/)index\.js))/
複製代碼
會發現一個新東西(?<=)
,這是es6新增的後行斷言語法,因此老的引擎都不支持
可是重點不是語法問題,而是捕捉
咱們要獲取的確定是module1這種,怎麼過一次性取出來呢?
若是要匹配的話要根據特徵前面有「/」,後面有「/index.js」,可是匹配的話會攜帶,咱們的想法確定是要將他們除去,可能會想到「^」,可是隻能支持單字符
這時,應該想到斷言,在用斷言的時候會發現,這種語法並不會將匹配的內容附加進來,好比:
ab
複製代碼
捕獲a後的b,在正則表達式的意義上爲b的前一個位置是a,屬於後行斷言。
const reg=/(?<=a)b/ //b
複製代碼
捕獲b前的a,在正則表達式的意義上爲a的後一個位置是b,屬於先行斷言。
const reg=/a(?=b)/ //a
複製代碼
利用這點咱們能夠一次性提取出來」module1「、「module2「、「aaa」
沒了,若是以爲有用請別忘記點贊~
有疑問下方評論