摘要:正則表達(dá)式位數(shù)和零寬斷言之前的文章里,已經(jīng)給大家展示了正則的匹配流程,希望大家能夠好好回顧下。下面我們主要討論兩部分的內(nèi)容正則表達(dá)式的位數(shù),零寬斷言正則表達(dá)式的位數(shù)在有需要正則表達(dá)式,很常見的操作就百度一下。
正則表達(dá)式位數(shù)和零寬斷言
之前的文章里,已經(jīng)給大家展示了正則的匹配流程,希望大家能夠好好回顧下。https://segmentfault.com/a/11...
下面我們主要討論兩部分的內(nèi)容:1. 正則表達(dá)式的位數(shù),2. 零寬斷言
在有需要正則表達(dá)式,很常見的操作就百度一下。看能不能找到滿足我需求的。有時(shí)候你會(huì)找到的,比如手機(jī)校驗(yàn),密碼校驗(yàn),郵箱校驗(yàn)。但是很多人往往都看不懂網(wǎng)上的正則的意思。這個(gè)就是學(xué)習(xí)正則的一個(gè)誤區(qū)。
在我看來,我們學(xué)習(xí)正則應(yīng)該是:了解其匹配過程,再看懂正則表達(dá)式,最后才是自己寫正則表達(dá)式。
下面主要講的就是怎么看懂正則表達(dá)式。而看懂正則表達(dá)式的關(guān)鍵--表達(dá)式匹配的字符位數(shù)。
我們拿例子來說吧。
// 第一個(gè)例子,表達(dá)式匹配4個(gè)字符,一個(gè)“非語法關(guān)鍵字”的字符會(huì)占一位。 var reg1 = /abcd/; // 第一個(gè)例子, 表達(dá)式匹配了5個(gè)字符(先是ab,再是abc里的任意一個(gè),接著是cd)。說明下:[]范圍內(nèi)的內(nèi)容能占一位,不管里面放了多少東西都是或的意思。 var reg2 = /ab[abc]cd/; // 第三個(gè)例子, 匹配了5個(gè)或以上(先是ab,再是abc里的任意一個(gè),接著是c,最后是一個(gè)d或者很多個(gè)d),這類的功能類似的*,{1,5} var reg3 = /ab[abc]cd+/; // 第四個(gè)例子,匹配4個(gè)(三個(gè)字符abd,和一個(gè)[])。 像^, $這類的標(biāo)示位置的語法是不會(huì)占一個(gè)字符的,只是對(duì)位置的一些要求。 var reg4 = /^ab[abc]d$/ // 第五個(gè)例子(這個(gè)是個(gè)真實(shí)例子,不知道大家能否快速看清),匹配無數(shù)字符(首選匹配##item#七個(gè)字符,接著匹配任意字符的任意個(gè),接著匹配字符#item##) // 這個(gè)里面的?是不要貪婪模式,其實(shí)這里說是遇到第一個(gè)#item##。關(guān)于貪婪模式,希望大家自己查閱下。 var reg5 = /((##item#)([w|W])+?(#item##))/
我是通過例子,想盡量說的直白點(diǎn),讓大家更容易理解。我這里面的例子并沒有列全情況,如果大家有什么不理解的正則,不確定里面匹配多少位數(shù),歡迎在下面留言,我看到就會(huì)給大家解答。
下面我們說說零寬斷言
在說清楚零寬斷言,我們需要簡單介紹下為啥會(huì)有這個(gè)。它的存在是為了解決什么問題呢?
這個(gè)存在是解決我們一些特定的要求,且不需要展占位數(shù)。比如:字符串的開頭和結(jié)尾用"#"替換(/^|$/, 需要找到開頭和結(jié)尾,又沒有真實(shí)字符),數(shù)字字符串每隔三位添加一個(gè)逗號(hào),字符串里b的后面不能是數(shù)字等等,這些都是對(duì)位置的條件,但這些條件本身又沒有占位。
表示位置,又不占字符的語法總共就這些:^ $ B (?=) (?!)
^(脫字符)匹配開頭,在多行匹配中匹配行開頭。
$(美元符號(hào))匹配結(jié)尾,在多行匹配中匹配行結(jié)尾。
b是單詞邊界,具體就是w和W之間的位置,也包括w和^之間的位置,也包括w和$之間的位置。
B就是b的反面的意思,非單詞邊界。例如在字符串中所有位置中,扣掉b,剩下的都是B的。
以上4個(gè)比較簡單,尤其是^ 和$,這里就不多說了。下面主要說說這兩個(gè)(?=)和(?!)
(?= P)表示的此刻位置后面應(yīng)該是P模式,這個(gè)模式不單單是字符,也可能是復(fù)雜正則。比如(?= l),(?= [abc]ede), (?= d +)
(?!p) 表示的此刻位置后面應(yīng)該是P模式的以外的位置,和上一個(gè)正好相反。
舉幾個(gè)例子幫助理解下
// 第一個(gè)例子, 正則的表達(dá)式,要求在cate后位置的后面應(yīng)該是一個(gè)數(shù)字。再之后應(yīng)該是數(shù)字位,再之后是ok。d是不能少的,也很好的說明了(?=)是不占位。 var reg6 = /cate(?=d)dok/ var str = "cate3ok" str.match(reg6); // cate3ok // 第二個(gè)例子,如果我們想在##p#和#p##之前的字符串里有ok字符這段字符串。 var reg7 = /##p#(?=.*ok).*#p##/ var str1 = "##p#fsdfsdokdfsdfs#p##" reg7.test(str1); // 第三個(gè)例子,如果我們想在##p#和#p##之前的字符串里有ok字符這段字符串。如果字符串里有兩段##p#怎么辦呢? var reg7 = /##p#(?=.*ok).*#p##/ var str1 = "##p#fsokfs#p####p#fsfs#p##" str1.match(reg7) // ##p#fsokfs#p####p#fsfs#p## 這個(gè)結(jié)果就不是我們想要的了。不知大家能否想明白? // 我們把正則改下 var reg8 = /##p#(?=.*ok).*?#p##/ str1.match(reg8) //##p#fsokfs#p## // 好像是對(duì)了哦,但是我們把字符串改下, 兩段##p#換個(gè)位置 var str2 = "##p#fsfs#p####p#fsokfs#p##"; str2.match(reg8) // ##p#fsfs#p## 又不對(duì)了。 這個(gè)地方不知能否想明白。 // 我們再把正則改下 var reg9 = /##p#(?=(.(?!#p##))*ok).*?#p##/; str2.match(reg9); // ##p#fsokfs#p## 這次就對(duì)上了。
我想對(duì)最后的正則進(jìn)行解釋下。 首選是?#p## 這個(gè)地方的?是告訴正則我不用貪婪模式,(?=(.(?!#p##)).*ok).* 這部分里我們先不看里面的?部分,把它當(dāng)成P(?=p.*ok).*, 這部分意思,我們需要任意字符,在任意字符的后面任意位置應(yīng)該出現(xiàn)一個(gè)OK。最后里面的?部分,其實(shí)也是對(duì)這個(gè)任意字符的條件,要求任意字符后面不能是#p##字符串。這樣就實(shí)現(xiàn)了啦。
我知道這個(gè)可能很難理解清楚,希望大家還是多看看,多想想。如果有問題,還是歡迎下面留言。
作者:易企秀——philips
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106491.html
摘要:正則表達(dá)式位數(shù)和零寬斷言之前的文章里,已經(jīng)給大家展示了正則的匹配流程,希望大家能夠好好回顧下。下面我們主要討論兩部分的內(nèi)容正則表達(dá)式的位數(shù),零寬斷言正則表達(dá)式的位數(shù)在有需要正則表達(dá)式,很常見的操作就百度一下。 正則表達(dá)式位數(shù)和零寬斷言 之前的文章里,已經(jīng)給大家展示了正則的匹配流程,希望大家能夠好好回顧下。https://segmentfault.com/a/11...下面我們主要討論兩...
摘要:正則表達(dá)式位數(shù)和零寬斷言之前的文章里,已經(jīng)給大家展示了正則的匹配流程,希望大家能夠好好回顧下。下面我們主要討論兩部分的內(nèi)容正則表達(dá)式的位數(shù),零寬斷言正則表達(dá)式的位數(shù)在有需要正則表達(dá)式,很常見的操作就百度一下。 正則表達(dá)式位數(shù)和零寬斷言 之前的文章里,已經(jīng)給大家展示了正則的匹配流程,希望大家能夠好好回顧下。https://segmentfault.com/a/11...下面我們主要討論兩...
摘要:控制權(quán)和傳動(dòng)這兩個(gè)詞可能在搜一些博文或者資料的時(shí)候會(huì)遇到,這里做一個(gè)解釋先控制權(quán)是指哪一個(gè)正則子表達(dá)式可能為一個(gè)普通字符元字符或元字符序列組成在匹配字符串,那么控制權(quán)就在哪。 溫馨提示:文章很長很長,保持耐心,必要時(shí)可以跳著看,當(dāng)然用來查也是不錯(cuò)的。 正則啊,就像一座燈塔,當(dāng)你在字符串的海洋不知所措的時(shí)候,總能給你一點(diǎn)思路;正則啊,就像一臺(tái)驗(yàn)鈔機(jī),在你不知道用戶提交的鈔票真假的時(shí)候,...
摘要:注意本文將正則與中的正則分開討論。正則零寬斷言更多參考各種語言對(duì)于正則不同支持參考單行模式與多行模式通過設(shè)置正則表達(dá)式后的修飾符可開啟對(duì)應(yīng)的匹配模式單行模式和多行模式。 最近這段時(shí)間幫同學(xué)處理一些文檔, 涉及到一些結(jié)構(gòu)化文檔的工作大部分都得使用正則表達(dá)式, 之前對(duì)于正則的認(rèn)識(shí)大多來源于語言書上那幾頁的介紹, 自己也沒有用過幾次。這里將我之前感到模糊的概念作個(gè)整理。因?yàn)閷?duì)JS了解多點(diǎn),所...
摘要:參考資料慕課網(wǎng)鬼斧神工之正則表達(dá)式正則表達(dá)式后向引用詳解正則表達(dá)式分鐘入門教程什么是正則表達(dá)式正則表達(dá)式是字符串的搜索和匹配的工具。貪婪模式懶惰模式后向引用分組捕獲的內(nèi)容可以在表達(dá)式或其他程序中作進(jìn)一步的處理。 參考資料 慕課網(wǎng)-鬼斧神工之正則表達(dá)式正則表達(dá)式后向引用詳解正則表達(dá)式30分鐘入門教程 什么是正則表達(dá)式? 正則表達(dá)式是字符串的搜索和匹配的工具。 正則表達(dá)式工具 一個(gè)測試正...
閱讀 2471·2023-04-25 21:41
閱讀 1647·2021-09-22 15:17
閱讀 1921·2021-09-22 10:02
閱讀 2433·2021-09-10 11:21
閱讀 2569·2019-08-30 15:53
閱讀 996·2019-08-30 15:44
閱讀 946·2019-08-30 13:46
閱讀 1125·2019-08-29 18:36