亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

淺談正則速記法的技巧

2020-03-16 20:47:11
字體:
來源:轉載
供稿:網友

給你一篇文章,如何挑選出你想要的字符串呢?你可以從左到右從上到下,一個一個字符讀取出來,寫一大堆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,單靠正則就無法完成了。

正則難,難在門檻高,門檻高在難記,之所以難記,其實還是因為反人類的符號讓你下意識的排斥它。熟悉正則,正式正則,學會正則,會給你帶來超乎想象的便利!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到正則表達式頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人激情在线| 黄色一区二区在线观看| 九九九久久久久久| 日韩免费视频在线观看| 国产精品久久久久久久久久尿| 亚洲电影免费观看高清完整版在线| 欧美国产在线视频| 欧美人交a欧美精品| 久久精品影视伊人网| 亚洲美女在线观看| 国产成人一区二区三区小说| 欧美日韩国产在线看| 日韩在线观看视频免费| 2018中文字幕一区二区三区| 亚洲精品www久久久久久广东| 96国产粉嫩美女| 在线日韩中文字幕| 91香蕉国产在线观看| 日本高清+成人网在线观看| 亚洲一区av在线播放| 欧美美女操人视频| 不卡中文字幕av| 国产在线观看不卡| 亚洲最大福利视频网站| 欧美网站在线观看| 亚洲激情视频在线观看| 日韩中文字幕在线| 国产精品天天狠天天看| 欧美老肥婆性猛交视频| 蜜臀久久99精品久久久久久宅男| 亚洲性线免费观看视频成熟| 亚洲精品少妇网址| 两个人的视频www国产精品| 久久av资源网站| 欧美精品久久久久久久久| 亚洲美女www午夜| 丰满岳妇乱一区二区三区| 欧美巨猛xxxx猛交黑人97人| 国产成人av网址| 一区二区日韩精品| 日韩欧美在线看| 91精品久久久久久久久青青| 国产精品入口尤物| 清纯唯美亚洲激情| 亚洲欧美日韩天堂一区二区| 亚洲aa在线观看| 插插插亚洲综合网| 亚洲第一网站免费视频| 日韩av在线免费播放| 国产精品久久久久9999| 国产亚洲精品久久| 欧美性猛交xxxx黑人猛交| 国产精品久久色| 在线观看亚洲区| 久久韩国免费视频| 日韩av在线网站| 2019中文字幕在线观看| 欧美精品国产精品日韩精品| 国产一区二区在线免费视频| 久久久久久国产精品三级玉女聊斋| 国内精品久久久久久久| 午夜精品视频在线| 中文字幕久热精品在线视频| 日韩精品在线观看一区二区| 2020久久国产精品| 欧美中文字幕第一页| www.日韩视频| 亚洲少妇激情视频| 亚洲精品ady| 欧美成人性生活| 亚洲精品v欧美精品v日韩精品| 一区二区三区久久精品| 国产精品www网站| 亚洲国产欧美日韩精品| 亚洲第一精品电影| 国产女人精品视频| 国产精品∨欧美精品v日韩精品| 欧美日韩国产一区二区| 一色桃子一区二区| 成人在线免费观看视视频| 2019国产精品自在线拍国产不卡| 亚洲性无码av在线| 日韩有码在线播放| 国产丝袜精品视频| 亚洲精品av在线| 欧美极品少妇xxxxⅹ裸体艺术| 日韩一中文字幕| 欧美成人合集magnet| 精品一区二区三区三区| 国产69精品99久久久久久宅男| 亚洲美女精品成人在线视频| 国产精品美女久久久免费| 日韩有码片在线观看| 影音先锋欧美精品| 欧美日韩国产中文字幕| 中文字幕精品一区久久久久| 亚洲乱码国产乱码精品精天堂| 国产精品扒开腿做爽爽爽的视频| 91啪国产在线| 国产成人一区二区三区| 一个人看的www欧美| 97热在线精品视频在线观看| 人体精品一二三区| 91精品久久久久久| x99av成人免费| 国产精品第七影院| 久久五月情影视| 亚洲一区美女视频在线观看免费| 亚洲一区中文字幕在线观看| 日韩电影在线观看免费| 日本中文字幕久久看| 日韩有码在线播放| 亚洲欧美综合精品久久成人| 久久成人在线视频| 亚洲国产精品人人爽夜夜爽| 日韩电影视频免费| 欧美体内谢she精2性欧美| 91精品国产91久久久| 69av在线播放| 日韩av在线一区二区| 欧美日韩国产成人在线观看| 亚洲欧美日韩一区二区三区在线| 欧美精品激情视频| 欧美日韩加勒比精品一区| 国产脚交av在线一区二区| 国产一区二区三区在线免费观看| 国产精品私拍pans大尺度在线| 热99在线视频| 欧美性猛交xxxx富婆| 日韩在线视频中文字幕| 久久777国产线看观看精品| 日韩免费在线视频| 91手机视频在线观看| 亚洲国产天堂久久综合| 国产精品女主播视频| 亚洲精品电影在线| 国产玖玖精品视频| 91精品国产91久久久久久最新| 欧美丝袜一区二区三区| 久久久久久久久久久免费| 91网在线免费观看| 成人美女免费网站视频| 亚洲伦理中文字幕| 欧美性生交xxxxxdddd| 久久久久久国产精品美女| 中文字幕日韩电影| 欧美精品激情在线| 久久精品色欧美aⅴ一区二区| 中文字幕一区电影| 97色在线观看免费视频| 日韩久久精品成人| 亚洲日本欧美中文幕| 欧美日韩精品二区| 国产亚洲精品久久久久久| 亚洲国产精品99久久| 国产精品一区二区久久久| 精品爽片免费看久久| 亚洲天堂免费在线| 国产亚洲aⅴaaaaaa毛片| 8x海外华人永久免费日韩内陆视频| 亚洲国产精品一区二区久| 精品露脸国产偷人在视频| 精品国产一区二区三区久久久狼| 中文字幕免费精品一区高清|