摘要:正則表達式位數和零寬斷言之前的文章里,已經給大家展示了正則的匹配流程,希望大家能夠好好回顧下。下面我們主要討論兩部分的內容正則表達式的位數,零寬斷言正則表達式的位數在有需要正則表達式,很常見的操作就百度一下。
正則表達式位數和零寬斷言
之前的文章里,已經給大家展示了正則的匹配流程,希望大家能夠好好回顧下。https://segmentfault.com/a/11...
下面我們主要討論兩部分的內容:1. 正則表達式的位數,2. 零寬斷言
在有需要正則表達式,很常見的操作就百度一下。看能不能找到滿足我需求的。有時候你會找到的,比如手機校驗,密碼校驗,郵箱校驗。但是很多人往往都看不懂網上的正則的意思。這個就是學習正則的一個誤區。
在我看來,我們學習正則應該是:了解其匹配過程,再看懂正則表達式,最后才是自己寫正則表達式。
下面主要講的就是怎么看懂正則表達式。而看懂正則表達式的關鍵--表達式匹配的字符位數。
我們拿例子來說吧。
// 第一個例子,表達式匹配4個字符,一個“非語法關鍵字”的字符會占一位。 var reg1 = /abcd/; // 第一個例子, 表達式匹配了5個字符(先是ab,再是abc里的任意一個,接著是cd)。說明下:[]范圍內的內容能占一位,不管里面放了多少東西都是或的意思。 var reg2 = /ab[abc]cd/; // 第三個例子, 匹配了5個或以上(先是ab,再是abc里的任意一個,接著是c,最后是一個d或者很多個d),這類的功能類似的*,{1,5} var reg3 = /ab[abc]cd+/; // 第四個例子,匹配4個(三個字符abd,和一個[])。 像^, $這類的標示位置的語法是不會占一個字符的,只是對位置的一些要求。 var reg4 = /^ab[abc]d$/ // 第五個例子(這個是個真實例子,不知道大家能否快速看清),匹配無數字符(首選匹配##item#七個字符,接著匹配任意字符的任意個,接著匹配字符#item##) // 這個里面的?是不要貪婪模式,其實這里說是遇到第一個#item##。關于貪婪模式,希望大家自己查閱下。 var reg5 = /((##item#)([w|W])+?(#item##))/
我是通過例子,想盡量說的直白點,讓大家更容易理解。我這里面的例子并沒有列全情況,如果大家有什么不理解的正則,不確定里面匹配多少位數,歡迎在下面留言,我看到就會給大家解答。
下面我們說說零寬斷言
在說清楚零寬斷言,我們需要簡單介紹下為啥會有這個。它的存在是為了解決什么問題呢?
這個存在是解決我們一些特定的要求,且不需要展占位數。比如:字符串的開頭和結尾用"#"替換(/^|$/, 需要找到開頭和結尾,又沒有真實字符),數字字符串每隔三位添加一個逗號,字符串里b的后面不能是數字等等,這些都是對位置的條件,但這些條件本身又沒有占位。
表示位置,又不占字符的語法總共就這些:^ $ B (?=) (?!)
^(脫字符)匹配開頭,在多行匹配中匹配行開頭。
$(美元符號)匹配結尾,在多行匹配中匹配行結尾。
b是單詞邊界,具體就是w和W之間的位置,也包括w和^之間的位置,也包括w和$之間的位置。
B就是b的反面的意思,非單詞邊界。例如在字符串中所有位置中,扣掉b,剩下的都是B的。
以上4個比較簡單,尤其是^ 和$,這里就不多說了。下面主要說說這兩個(?=)和(?!)
(?= P)表示的此刻位置后面應該是P模式,這個模式不單單是字符,也可能是復雜正則。比如(?= l),(?= [abc]ede), (?= d +)
(?!p) 表示的此刻位置后面應該是P模式的以外的位置,和上一個正好相反。
舉幾個例子幫助理解下
// 第一個例子, 正則的表達式,要求在cate后位置的后面應該是一個數字。再之后應該是數字位,再之后是ok。d是不能少的,也很好的說明了(?=)是不占位。 var reg6 = /cate(?=d)dok/ var str = "cate3ok" str.match(reg6); // cate3ok // 第二個例子,如果我們想在##p#和#p##之前的字符串里有ok字符這段字符串。 var reg7 = /##p#(?=.*ok).*#p##/ var str1 = "##p#fsdfsdokdfsdfs#p##" reg7.test(str1); // 第三個例子,如果我們想在##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## 這個結果就不是我們想要的了。不知大家能否想明白? // 我們把正則改下 var reg8 = /##p#(?=.*ok).*?#p##/ str1.match(reg8) //##p#fsokfs#p## // 好像是對了哦,但是我們把字符串改下, 兩段##p#換個位置 var str2 = "##p#fsfs#p####p#fsokfs#p##"; str2.match(reg8) // ##p#fsfs#p## 又不對了。 這個地方不知能否想明白。 // 我們再把正則改下 var reg9 = /##p#(?=(.(?!#p##))*ok).*?#p##/; str2.match(reg9); // ##p#fsokfs#p## 這次就對上了。
我想對最后的正則進行解釋下。 首選是?#p## 這個地方的?是告訴正則我不用貪婪模式,(?=(.(?!#p##)).*ok).* 這部分里我們先不看里面的?部分,把它當成P(?=p.*ok).*, 這部分意思,我們需要任意字符,在任意字符的后面任意位置應該出現一個OK。最后里面的?部分,其實也是對這個任意字符的條件,要求任意字符后面不能是#p##字符串。這樣就實現了啦。
我知道這個可能很難理解清楚,希望大家還是多看看,多想想。如果有問題,還是歡迎下面留言。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54123.html
摘要:正則表達式位數和零寬斷言之前的文章里,已經給大家展示了正則的匹配流程,希望大家能夠好好回顧下。下面我們主要討論兩部分的內容正則表達式的位數,零寬斷言正則表達式的位數在有需要正則表達式,很常見的操作就百度一下。 正則表達式位數和零寬斷言 之前的文章里,已經給大家展示了正則的匹配流程,希望大家能夠好好回顧下。https://segmentfault.com/a/11...下面我們主要討論兩...
摘要:正則表達式位數和零寬斷言之前的文章里,已經給大家展示了正則的匹配流程,希望大家能夠好好回顧下。下面我們主要討論兩部分的內容正則表達式的位數,零寬斷言正則表達式的位數在有需要正則表達式,很常見的操作就百度一下。 正則表達式位數和零寬斷言 之前的文章里,已經給大家展示了正則的匹配流程,希望大家能夠好好回顧下。https://segmentfault.com/a/11...下面我們主要討論兩...
摘要:控制權和傳動這兩個詞可能在搜一些博文或者資料的時候會遇到,這里做一個解釋先控制權是指哪一個正則子表達式可能為一個普通字符元字符或元字符序列組成在匹配字符串,那么控制權就在哪。 溫馨提示:文章很長很長,保持耐心,必要時可以跳著看,當然用來查也是不錯的。 正則啊,就像一座燈塔,當你在字符串的海洋不知所措的時候,總能給你一點思路;正則啊,就像一臺驗鈔機,在你不知道用戶提交的鈔票真假的時候,...
摘要:參考資料慕課網鬼斧神工之正則表達式正則表達式后向引用詳解正則表達式分鐘入門教程什么是正則表達式正則表達式是字符串的搜索和匹配的工具。貪婪模式懶惰模式后向引用分組捕獲的內容可以在表達式或其他程序中作進一步的處理。 參考資料 慕課網-鬼斧神工之正則表達式正則表達式后向引用詳解正則表達式30分鐘入門教程 什么是正則表達式? 正則表達式是字符串的搜索和匹配的工具。 正則表達式工具 一個測試正...
閱讀 3705·2021-11-22 13:52
閱讀 3603·2019-12-27 12:20
閱讀 2385·2019-08-30 15:55
閱讀 2144·2019-08-30 15:44
閱讀 2262·2019-08-30 13:16
閱讀 574·2019-08-28 18:19
閱讀 1881·2019-08-26 11:58
閱讀 3436·2019-08-26 11:47