你是否曾經遇到這樣的場景:你需要匹配一個字符串中不以某個詞結尾的所有出現次數,但卻不能匹配其結尾的那個詞。這時,反向預查就可以派上用場了!
反向預查(negative lookbehind)是一種在匹配字符串時,可以先確定一個位置之前有什么內容的正則表達式。在JavaScript正則表達式中,反向預查使用問號、小括號和等號來定義。
下面,我們來看一個例子。假設我們有一個字符串,其中包含了以星號開頭的多個單詞。我們需要匹配所有不是以“hello”結尾的單詞,但不能匹配“hello”本身。
let str = "*howdy hello world hello*"; let regExp = /(?在這個正則表達式中,我們使用了“反向預查”(?:
(?<!pattern)
- 表示零寬度負預測先行斷言,匹配前面不是 pattern 的位置。\b
- 表示單詞邊界。\w+
- 表示匹配單詞,此處表示匹配單詞的一部分。g
- 表示全局匹配。
這時,我們就可以獲得所有不是以“hello”結尾的單詞,但不能匹配“hello”本身。
下面,我們再來看一個例子,在這個例子中,我們需要查找一個字符串中的連續數字,并且這些數字不能以0開頭。我們可以使用反向預查來實現:
let str = "123,456,789,0001"; let regExp = /(?在這個正則表達式中,我們使用了“反向預查”(?:<!0)和(?!\d),表示捕獲所有不以0開頭的數字。具體解釋如下:
(?<!pattern)
- 表示零寬度負預測先行斷言,匹配前面不是 pattern 的位置。\d+
- 表示匹配數字。(?![0-9])
- 表示零寬度負預測后發斷言,匹配后面不是數字的位置。g
- 表示全局匹配。
在我們的表達式中,首先要求當前位置前面不能是數字0。其次需匹配一個或多個數字,再次,當前位置后面需要是非數字符號。
反向預查是一種非常強大的正則表達式功能,因為它可以使我們在匹配字符串時,考慮到前面或后面的內容是否存在。它給我們提供了更多的靈活性和更多的選擇,可以讓我們在需要的時候做出更準確的匹配。