您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關正則速記法的技巧有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
如何挑選出你想要的字符串呢?你可以從左到右從上到下,一個一個字符讀取出來,寫一大堆if做判斷。這樣太麻煩了,正則就是將以上過程抽象出來,用一些特定符號就能表示出大部分規則
對大部分人來說,正則主要是難記,其實只要對正則符號分類記憶,就會發現核心概念其實特別簡單
注:本文會假設你至少看過一遍正則的文檔,如果沒看過,可以看mdn(有中文翻譯),如果覺得mdn排版亂,推薦去https://devdocs.io/javascript/global_objects/regexp學習。本文所使用語言為javascript
元字符
/a/
中的a就是一個元字符,一個元字符匹配一個實體字符,這里的“a”沒有特殊含義,就匹配一個英文a
像/\d/
就匹配0到9的所有數字,如果兩個連寫/\d\d/
就可以匹配10到99的所有數字
/./
可以匹配任何字符
集合
假如有一串字符串'0123456789'
,我只想匹配其中的'3','6','9',這時可以放在集合中/[369]/
執行后會發現只有3被匹配到,是因為集合中不管寫多少東西都代表一個元字符,集合也是一種元字符
你可能見過這樣都集合/[0-9a-zA-Z_]/
它代表匹配所有數字,字母和下劃線,它與元字符/\w/的效果是一樣的,集合更靈活\w更方便
排除型集合
/[^0-9]/
除了數字都匹配(我喜歡叫它否定集合)
或(多選)
假設我有一大堆書單,我希望從中匹配出naroto和one piece,那么可以這樣寫/naroto|one pice/
豎線代表或,a或b,你也可以寫多個a|b|c|d,你當然可以寫出0|1|2...|9來匹配所有數字。但要注意和集合的區別,集合是一個元字符,不能匹配單詞,|
兩邊可以是多個元字符
分組
我現在有一堆文件,我希望匹配出后綴是.css和.less的文件,你可以很自然的寫出/.css|.less/
這樣的代碼。其實還有一個簡便寫法/.(c|le)ss/
,分組可以將若干個元字符放在同一個作用域中做處理,通過分組我們可以寫出更簡練的代碼
分組還有一個特殊的用法,思考如何匹配'asd_asd_asd_asd_asd'
這種字符串?
答案是/(asd)(_\1)+/,\1
是個非常特殊的元字符,代表重復使用第一個分組的匹配結果,\2就代表第二個,以此類推,+加號表示重復一到多次(這個后面會講),需要注意的是計數從1開始,\0代表另外的意思(請看文檔)
量詞
一長串字符中我只想匹配連續的數字,但/\d/
只會匹配一個,這時候可以使用量詞/\d{n,}/
,n寫幾就是幾到多,比如{1,}就是1到多。{n}這種寫法表示n個相連,匹配2333可以寫成/23{3}/
還有幾個簡寫的量詞
+代表1到多,等于{1,}
*代表0到多,等于{0,}
?代表0或1個,等于{0,1}
貪婪模式和非貪婪模式
量詞有個尷尬的地方,比如用/.*a/
去匹配 '123a123a'
,本來希望得到'123a'
,實際卻得到'123a123a'
。這是因為任何字符都滿足/./
加上量詞會導致從頭匹配到尾,但因為我們還有其他元字符,所以這時正則引擎會回溯,將已經匹配的結果從后往前一個個拿出來,與剩下的元字符相匹配。
這種模式叫貪婪模式,它可能會產生預期之外的結果和不必要的性能浪費
解決方案是使用非貪婪模式,在量詞后面加?
問號可以得到最小結果,現在使用/.*?a/
去匹配就可以得到'123a'
了。任何量詞后都可以使用非貪婪模式
環視
x(?=y)
這個功能有很多種翻譯,比如零寬斷言,我個人感覺比較準確的是“正向肯定環視”x(?!y)
正向否定環視
x代表元字符,y也代表元字符,x(?=y)
的意思是緊接著y的x,比如 '-1a--2b-'
,使用/\d(?=a)/
去匹配,會得到1;/\d(?!a)/去匹配,會得到2。
這功能怎么用?舉個例子,有一段字符串'a(123)b'
,我只想要括號內的內容,但不想要括號
我需要匹配到右括號左邊的位置,那么我可以寫成/(?=\))/
(注意括號需要轉義),我不想要左括號/[^(]/
,我不關心括號內的內容/.*/
,這時組合三個正則就變成了/[^(].*(?=\))/
實際上這個功能匹配的是位置,從匹配到的位置開始找元字符,所以你如果在環視后面加量詞是沒用的
其他
^
和$
也是匹配位置的元字符,分別是匹配開頭和結尾,比如我們想匹配文件結尾是.js的文件可以寫成/.js$/
。匹配http開頭的鏈接可以寫成/^http:\/\//
還有一些特殊的\u[\b]\0等,需要你自己看文檔
標識符
g:一個正則只會匹配一次,如果加上g標識符就會全局匹配, /\d/g
,這個正則是不管兩個數字之間隔了什么,都會將所有數字匹配出來
i:不區分大小寫/^http:\/\//i
就會匹配http://和HTTP://
核心概念就這么多,其他內容請詳細查看文檔
你以為這就結束了?其實還有后續噠!
我要繼續說環視
還有個神奇的逆向環視沒有講x(?<=y)
,因為這是18年才進正式標準的功能,雖然它可能比js年齡大,但js就是不支持你怕不怕!
前面那個/[^(].*(?=\))/
可以改成/(?<=y).*(?=\))/
正則最大但坑就是,讓新手產生正則無所不能的想法,一個復雜字符串處理總以為可以通過一個神奇的正則來搞定。
正則不是萬能的!
還是之前的例子,給字符串'a(1\(2(3)'
讓你取括號內的內容請問你怎么取?首先應該弄清需求,如果正則過于難寫,可以用js的字符串處理函數輔助正則,分部操作。另外正則的性能并不高,不是說很復雜的操作寫成一行正則性能就比其他方式快了,沒有測試就沒有發言權
正則理論上是有極限的,舉個例子,有字符串1xxxyyyy2
讓你取{n}個x和{m}個y,n和m是不確定個數,寫成x{1,}y{1,}
是沒問題的,但如果要求是x{n}y{n}
就不行了,比如一個字符串有3個x,你就要取3個y,有4個x,你就要取4個y,單靠正則就無法完成了。
正則難,難在門檻高,門檻高在難記,之所以難記,其實還是因為反人類的符號讓你下意識的排斥它。熟悉正則,正式正則,學會正則,會給你帶來超乎想象的便利!
關于“正則速記法的技巧有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。