老姚小冊中沒有提到的兩小點

不得不說,老姚的小冊寫的特別好,使我半天基本上就掌握了正則。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」

沒了,若是以爲有用請別忘記點贊~

有疑問下方評論

相關文章
相關標籤/搜索