a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > regex > 正文

淺談?wù)齽t速記法的技巧

2020-01-20 21:59:00
字體:
供稿:網(wǎng)友

給你一篇文章,如何挑選出你想要的字符串呢?你可以從左到右從上到下,一個(gè)一個(gè)字符讀取出來,寫一大堆if做判斷。這樣太麻煩了,正則就是將以上過程抽象出來,用一些特定符號就能表示出大部分規(guī)則

對大部分人來說,正則主要是難記,其實(shí)只要對正則符號分類記憶,就會發(fā)現(xiàn)核心概念其實(shí)特別簡單

注:本文會假設(shè)你至少看過一遍正則的文檔,如果沒看過,可以看mdn(有中文翻譯),如果覺得mdn排版亂,推薦去https://devdocs.io/javascript/global_objects/regexp學(xué)習(xí)。本文所使用語言為javascript

元字符

/a/中的a就是一個(gè)元字符,一個(gè)元字符匹配一個(gè)實(shí)體字符,這里的“a”沒有特殊含義,就匹配一個(gè)英文a

//d/就匹配0到9的所有數(shù)字,如果兩個(gè)連寫//d/d/就可以匹配10到99的所有數(shù)字

/./可以匹配任何字符

集合

假如有一串字符串'0123456789',我只想匹配其中的'3','6','9',這時(shí)可以放在集合中/[369]/

執(zhí)行后會發(fā)現(xiàn)只有3被匹配到,是因?yàn)榧现胁还軐懚嗌贃|西都代表一個(gè)元字符,集合也是一種元字符
你可能見過這樣都集合/[0-9a-zA-Z_]/它代表匹配所有數(shù)字,字母和下劃線,它與元字符//w/的效果是一樣的,集合更靈活/w更方便

排除型集合

/[^0-9]/除了數(shù)字都匹配(我喜歡叫它否定集合)

或(多選)

假設(shè)我有一大堆書單,我希望從中匹配出naroto和one piece,那么可以這樣寫/naroto|one pice/ 豎線代表或,a或b,你也可以寫多個(gè)a|b|c|d,你當(dāng)然可以寫出0|1|2...|9來匹配所有數(shù)字。但要注意和集合的區(qū)別,集合是一個(gè)元字符,不能匹配單詞,|兩邊可以是多個(gè)元字符

分組

我現(xiàn)在有一堆文件,我希望匹配出后綴是.css和.less的文件,你可以很自然的寫出/.css|.less/這樣的代碼。其實(shí)還有一個(gè)簡便寫法/.(c|le)ss/,分組可以將若干個(gè)元字符放在同一個(gè)作用域中做處理,通過分組我們可以寫出更簡練的代碼

分組還有一個(gè)特殊的用法,思考如何匹配'asd_asd_asd_asd_asd'這種字符串?

答案是/(asd)(_/1)+/,/1是個(gè)非常特殊的元字符,代表重復(fù)使用第一個(gè)分組的匹配結(jié)果,/2就代表第二個(gè),以此類推,+加號表示重復(fù)一到多次(這個(gè)后面會講),需要注意的是計(jì)數(shù)從1開始,/0代表另外的意思(請看文檔)

量詞

一長串字符中我只想匹配連續(xù)的數(shù)字,但//d/只會匹配一個(gè),這時(shí)候可以使用量詞//d{n,}/,n寫幾就是幾到多,比如{1,}就是1到多。{n}這種寫法表示n個(gè)相連,匹配2333可以寫成/23{3}/

還有幾個(gè)簡寫的量詞

  • +代表1到多,等于{1,}
  • *代表0到多,等于{0,}
  • ?代表0或1個(gè),等于{0,1}

貪婪模式和非貪婪模式

量詞有個(gè)尷尬的地方,比如用/.*a/去匹配 '123a123a',本來希望得到'123a',實(shí)際卻得到'123a123a'。這是因?yàn)槿魏巫址紳M足/./加上量詞會導(dǎo)致從頭匹配到尾,但因?yàn)槲覀冞€有其他元字符,所以這時(shí)正則引擎會回溯,將已經(jīng)匹配的結(jié)果從后往前一個(gè)個(gè)拿出來,與剩下的元字符相匹配。
這種模式叫貪婪模式,它可能會產(chǎn)生預(yù)期之外的結(jié)果和不必要的性能浪費(fèi)

解決方案是使用非貪婪模式,在量詞后面加?問號可以得到最小結(jié)果,現(xiàn)在使用/.*?a/去匹配就可以得到'123a'了。任何量詞后都可以使用非貪婪模式

環(huán)視

x(?=y)這個(gè)功能有很多種翻譯,比如零寬斷言,我個(gè)人感覺比較準(zhǔn)確的是“正向肯定環(huán)視”
x(?!y)正向否定環(huán)視

x代表元字符,y也代表元字符,x(?=y)的意思是緊接著y的x,比如 '-1a--2b-',使用//d(?=a)/去匹配,會得到1;//d(?!a)/去匹配,會得到2。

這功能怎么用?舉個(gè)例子,有一段字符串'a(123)b',我只想要括號內(nèi)的內(nèi)容,但不想要括號
我需要匹配到右括號左邊的位置,那么我可以寫成/(?=/))/(注意括號需要轉(zhuǎn)義),我不想要左括號/[^(]/,我不關(guān)心括號內(nèi)的內(nèi)容/.*/,這時(shí)組合三個(gè)正則就變成了/[^(].*(?=/))/

實(shí)際上這個(gè)功能匹配的是位置,從匹配到的位置開始找元字符,所以你如果在環(huán)視后面加量詞是沒用的

其他

^$也是匹配位置的元字符,分別是匹配開頭和結(jié)尾,比如我們想匹配文件結(jié)尾是.js的文件可以寫成/.js$/。匹配http開頭的鏈接可以寫成/^http://///

還有一些特殊的/u[/b]/0等,需要你自己看文檔

標(biāo)識符

g:一個(gè)正則只會匹配一次,如果加上g標(biāo)識符就會全局匹配, //d/g,這個(gè)正則是不管兩個(gè)數(shù)字之間隔了什么,都會將所有數(shù)字匹配出來

i:不區(qū)分大小寫/^http://///i就會匹配http://和HTTP://

核心概念就這么多,其他內(nèi)容請?jiān)敿?xì)查看文檔

你以為這就結(jié)束了?其實(shí)還有后續(xù)噠!

我要繼續(xù)說環(huán)視

還有個(gè)神奇的逆向環(huán)視沒有講x(?<=y) ,因?yàn)檫@是18年才進(jìn)正式標(biāo)準(zhǔn)的功能,雖然它可能比js年齡大,但js就是不支持你怕不怕!

前面那個(gè)/[^(].*(?=/))/可以改成/(?<=y).*(?=/))/

正則最大但坑就是,讓新手產(chǎn)生正則無所不能的想法,一個(gè)復(fù)雜字符串處理總以為可以通過一個(gè)神奇的正則來搞定。

正則不是萬能的!

還是之前的例子,給字符串'a(1/(2(3)'讓你取括號內(nèi)的內(nèi)容請問你怎么取?首先應(yīng)該弄清需求,如果正則過于難寫,可以用js的字符串處理函數(shù)輔助正則,分部操作。另外正則的性能并不高,不是說很復(fù)雜的操作寫成一行正則性能就比其他方式快了,沒有測試就沒有發(fā)言權(quán)

正則理論上是有極限的,舉個(gè)例子,有字符串1xxxyyyy2讓你取{n}個(gè)x和{m}個(gè)y,n和m是不確定個(gè)數(shù),寫成x{1,}y{1,}是沒問題的,但如果要求是x{n}y{n}就不行了,比如一個(gè)字符串有3個(gè)x,你就要取3個(gè)y,有4個(gè)x,你就要取4個(gè)y,單靠正則就無法完成了。

正則難,難在門檻高,門檻高在難記,之所以難記,其實(shí)還是因?yàn)榉慈祟惖姆栕屇阆乱庾R的排斥它。熟悉正則,正式正則,學(xué)會正則,會給你帶來超乎想象的便利!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲色图综合 | 影音先锋亚洲资源 | 国产精品一区二区三区四区在线观看 | 国产精品一区在线看 | 最新高清无码专区 | 成人福利av | 中文字幕一区二区三区乱码在线 | 日韩在线免费视频 | 九九热这里只有精品在线观看 | 日韩精品在线免费观看视频 | 日产久久 | 亚洲精品三级 | 亚洲福利一区 | 欧美一区二区久久久 | 人人草人人看 | 华丽的挑战在线观看 | 日韩久久久久久久久久 | av在线毛片 | 国产羞羞视频在线观看 | 91污视频| 日本黄色大片免费观看 | 四虎影视最新网址 | 精品久久久久久国产 | 久久99精品国产.久久久久 | 一区不卡在线观看 | 国产综合视频在线观看 | 青青久久 | 日本在线播放 | 一区免费在线观看 | 亚洲精品一二区 | 久久福利影院 | 国产一区久久 | 日日久| 欧美日韩中文字幕在线 | 国产高清无av久久 | 欧美日韩综合精品 | 午夜社区 | 日韩高清中文字幕 | 国产精品久久久久桃色tv | 欧美日韩一区二区三区在线观看 | 久久久麻豆 |