正則表達式環視、斷言、預查:開頭結尾匹配的技巧
本文深入探討正則表達式中環視(lookaround)、斷言和預查的用法,并解釋在匹配字符串開頭和結尾時,正向否定預查和反向否定預查為何使用方法不同,以及各自的含義。
我們從一個常見問題出發:使用正則表達式排除特定字符串時,為什么正向否定預查 ^(?!baidu).*$ 用于判斷不以 “baidu” 開頭的字符串,而反向否定預查卻不同?
關鍵在于理解向前預查和向后預查。^(?!baidu).*$ 并非簡單地“不以baidu開頭”,而是匹配“其后不跟著 baidu 的開頭”的空字符串,然后再加上任意字符串和結尾。它關注的是匹配位置之后的內容。
而判斷不以 “baidu” 開頭,可以直接使用 ^(?!baidu),無需 .*$。 同樣,判斷不以 “com” 結尾,應該使用 (?
以下代碼示例更清晰地解釋向前預查和向后預查的含義和區別:
/^(?!baidu)/.test('baidu.com'); // false /^(?!baidu)/.test('www.baidu.com'); // true /^(?<p>通過這些例子可以看出,正向預查 `(?=...)` 匹配的是當前位置之后滿足條件的字符串,而反向預查 `(?<=...)` 匹配的是當前位置之前滿足條件的字符串。</p>
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END