正則是用來匹配字符的,它一個重要用途就是搜索。javascript
說到搜索,很容易就想到搜索引擎,好比 Google
。java
Google
自己有一些簡單搜索技巧甚是有用。正則表達式
好比,實現集合運算功能:與、或、非。post
本文嘗試用正則來模擬一下。搜索引擎
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
,它匹配的是位置,不匹配任何字符。就跟 ^
同樣。
hello world
Google
搜索 hello world
或者 hello+world
。 它表示要搜索的目標網頁中,同時包括 hello
和 world
這兩個單詞。
用一個正則來判斷是否同時知足多個條件。最好的方法是使用 (?=p)
。
/^(?=.*hello)(?=.*world).*$/im.test(page)
複製代碼
hello OR world
若是在 Google
框中搜索 hello OR world
表示目標網頁中有 hello
或者 world
單詞。不強求兩者都出現。
正則中 |
天生就是用來處理「或」的邏輯:
/^.*(hello|world).*$/im.test(page)
複製代碼
用在 (?=p)
中其實也是能夠的:
/^(?=.*(hello|world)).*$/im.test(page)
複製代碼
hello-world
搜索 hello-world
表示,目標網頁要包含 hello
,但不包括 world
。
正則中 (?!p)
是 (?=p)
的反義。即判斷當前位置後的字符不知足正則表達式 p
。
/^(?=.*hello)(?!.*world).*$/im.test(page)
複製代碼
若是我要的目標網頁中,先出現 hello
,後出現 world
怎麼辦?
/^.*hello(?=.*world).*$/im.test(page)
複製代碼
注意下圖中第7行沒有高亮。
這是本人本月第 4
篇來講明正則斷言((?=p)、(?!p)、(?<=p)和(?<!p))用法的文章。
本文完。
歡迎閱讀《JS正則迷你書》。