正則的與或非

正則是用來匹配字符的,它一個重要用途就是搜索。javascript

說到搜索,很容易就想到搜索引擎,好比 Googlejava

Google 自己有一些簡單搜索技巧甚是有用。正則表達式

好比,實現集合運算功能:與、或、非。post

本文嘗試用正則來模擬一下。搜索引擎

1. 關鍵字

hello google

假如你在 google 裏搜索 hello,會怎樣?spa

包含hello這個單詞全部網頁會被搜索出來。3d

上圖下部分,咱們用 Test框 裏面文本的每一行來表示一個網頁。其中每一個網頁中的 hello 被高亮了。code

咱們能夠認爲判斷邏輯是:cdn

/hello/i.test(page)
複製代碼

爲了視覺上凸顯找到了正確的「網頁」,咱們讓任何一個包含 hello 的行,整個行都高亮起來。 此時須要修改正則:

/^.*hello.*$/im.test(page)
複製代碼

上述正則的意思是,容許 hello 先後都有其餘字符。效果以下:

要判斷字符串中是否有目標字符,其實也可使用斷言: (?=p)

/^(?=.*hello).*$/im.test(page)
複製代碼

「斷言」就是「能判斷是否是」的語句。

(?=p) 表示當前位置後面的字符知足正則表達式 p,它匹配的是位置,不匹配任何字符。就跟 ^ 同樣。

2. 與

hello world

Google 搜索 hello world 或者 hello+world。 它表示要搜索的目標網頁中,同時包括 helloworld 這兩個單詞。

用一個正則來判斷是否同時知足多個條件。最好的方法是使用 (?=p)

/^(?=.*hello)(?=.*world).*$/im.test(page)
複製代碼

3. 或

hello OR world

若是在 Google 框中搜索 hello OR world 表示目標網頁中有 hello 或者 world 單詞。不強求兩者都出現。

正則中 | 天生就是用來處理「或」的邏輯:

/^.*(hello|world).*$/im.test(page)
複製代碼

用在 (?=p) 中其實也是能夠的:

/^(?=.*(hello|world)).*$/im.test(page)
複製代碼

4. 非

hello-world

搜索 hello-world表示,目標網頁要包含 hello,但不包括 world

正則中 (?!p)(?=p) 的反義。即判斷當前位置後的字符不知足正則表達式 p

/^(?=.*hello)(?!.*world).*$/im.test(page)
複製代碼

5. 順序

若是我要的目標網頁中,先出現 hello,後出現 world 怎麼辦?

/^.*hello(?=.*world).*$/im.test(page)
複製代碼

注意下圖中第7行沒有高亮。

這是本人本月第 4 篇來講明正則斷言((?=p)、(?!p)、(?<=p)和(?<!p))用法的文章。

本文完。

歡迎閱讀《JS正則迷你書》

相關文章
相關標籤/搜索