摘要:點號正則中,有一個特殊的特殊的元字符,點號,它可以匹配任意字符,除了換行符。表各種量詞的轉義量詞轉義形式除此之外,元字符點也需要加反斜線來進行轉義。
??我們知道,在正則表達式中,可以使用[0-9]或d來匹配單個數字字符,但是,如果需要驗證一個更復雜的字符串呢,比如大陸地區的郵政編碼。
??不過郵政編碼并沒有特別規定,只有由6個數字組成的字符串而已, 如246512,根據[0-9]或d,我們可以很快的實現匹配的正則表達式,ffffdffffd。
??從上可以看出,我們重復用了6個單個字符來實現匹配,由于目前數字較少,看著還可以接受,那如果不是6個數字組成的,10個?20個?甚至是更多呢,顯然這種方式是不行的,正則表達式提供了量詞,用來限定出現的次數,可以很好解決這個問題。
首先,看下量詞的表示形式:
量詞的一般形式 表:一般形式量詞 | 說明 |
---|---|
{n} | 量詞前面的元素必須出現n次 |
{n,m} | 量詞前面的元素至少出現n次,最多出現m次 |
{n,} | 量詞前面的元素至少出現n次,無上限 |
{,m} | 量詞前面的元素可以不出現,也可以出現,最多出現m次(javascript不支持這種寫法) |
/^[0-9]{2}$/.test("12") // => true /^[0-9]{2}$/.test("123") // => false /^[0-9]{2,5}$/.test("123") // => true /^[0-9]{2,5}$/.test("123456") // => false /^[0-9]{2,}$/.test("123456") // => true /^[0-9]{0,5}$/.test("123456") // => false /^[0-9]{0,5}$/.test("12") // => true /^[0-9]{0,5}$/.test("") // => true注意:
1、{n,m}之間的逗號后面不能出現空格,否則無法正確匹配。
/^[0-9]{0, 5}$/.test("12") // => false
2、量詞限定的出現次數一般都有明確下限,如果沒有,則默認為0,所以推薦{,m}寫成{0,m},這是通用的寫法。
/^[0-9]{,5}$/.test("12") // => false常用量詞
{n,m}是通用形式的量詞,正則表達式還有3個常用的量詞,分別是+、?、*,雖然形式不同于{n,m},但功能確實相同的,可以當作是“量詞的簡介法”。
表:常用量詞常用量詞 | {n,m}等價形式 | 說明 |
---|---|---|
* | {0,} | 可能出現,也可能不出現,出現次數沒有上限 |
+ | {1,} | 至少出現次數為1,出現次數沒有上線 |
? | {0,1} | 最多出現1次,有可能不出現(出現0次或1次) |
/^d+(.d+)*$/.test("123") // => true /^d+(.d+)*$/.test("123.123") // => true /^d+(.d+)*$/.test("123.123.111") // => true /^d+(.d+)*$/.test("123.") // => false /^travell?er$/.test("traveller") // => true /^<[^>]+>$/.test("") // => true /^<[^>]+>$/.test("") // => true /^<[^>]+>$/.test("<>") // => false /^travell?er$/.test("traveler") // => true /^travell?er$/.test("traveller") // => true在實際開發中,很多情況用這三種表示形式幾乎可以滿足,因此使用頻率要高于{n,m}。
點號正則中,有一個特殊的特殊的元字符,點號.,它可以匹配任意字符,除了換行符( )。
如果需要用點號匹配任意字符,則必須在單行內匹配,或者使用其他的方式來替代,如[sS]、[wW]或[dD]。
但在實際開發中,許多人為了圖省事,很多情況下會這樣使用,這樣濫用點號將會帶來一些問題。如:
new RegExp("^.*$").exec("quoted "string "") new RegExp("^(([a-z]+)s")+$").exec("quoted "string "")如上,匹配的結果將會是整個字符串:"quoted "string "",這就是我們常說的貪婪模式。
匹配優先量詞
要弄清楚為什么會是這個結果,則必須了解表達式的匹配原理,以".*"為例。
在正則表達式中,點號.可以用來匹配除了換行符之外的所有字符,而*表示匹配的字符串長度沒有限制,所以在".*"匹配過程中,每遇到一個字符, ".*"都可以匹配,到底是匹配它,還是忽略它,將其留給最后的"來匹配呢?
答案是由量詞來決定的,在正則表達式中量詞分為幾類,匹配優先量詞(貪婪量詞)和忽略優先量詞(惰性量詞)(還有一種支配量詞,這里就不介紹了,請自行百度)匹配優先量詞,顧名思義,在拿不準是否匹配某個字符時,優先嘗試匹配,并且記下這個狀態,以備將來“反悔”。
忽略優先量詞
具體過程:
一開始,"匹配",然后到字符q,.*可以匹配q,也可以不匹配,但使用了匹配優先量詞*,所有.*會嘗試先匹配q,并且記錄下這個狀態。
接下來是字符字符u,.*可以匹配u,也可以不匹配,但使用了匹配優先量詞*,所有.*會嘗試先匹配u,并且記錄下這個狀態。
...
輪到字符",.*可以匹配",也可以不匹配,但使用了匹配優先量詞*,所有.*會嘗試先匹配",并且記錄下這個狀態。
最后是字符串末尾的",.*可以匹配",也可以不匹配,但使用了匹配優先量詞*,所有.*會嘗試先匹配",并且記錄下這個狀態。
這個時候,字符串后面已經沒有字符了,但是正則表達式中還是有"沒有匹配,所以只能查看之前保存的備用狀態,看看能不能回退幾步,以便匹配",于是讓.*后退幾步,以便讓"可以匹配",發現正好可以匹配,所以整個匹配宣告結束,這個“反悔”的過程,專業術語叫回溯。忽略優先量詞,與匹配優先量詞相反,在不確定是否匹配某個字符時,會優先選擇“不匹配”的狀態,在嘗試匹配表達式之后的字符,如果匹配失敗,則再回溯,選擇之前保存的“匹配的”狀態,這樣保證了匹配的正確性。
表:匹配優先量詞與忽略優先量詞
只需要把.*改為.*?即可變成忽略優先量詞。
具體過程: 類似于匹配優先量詞
這種匹配可以用于完成很多功能,比如匹配注釋,標簽等。轉義
匹配優先量詞 忽略優先量詞 * *? + +? ? ?? {n} {n}? {n,m} {n,m}? {n,} {n,}? {,m} {,m}? 在正則表達式中,+、?、*等量詞是特殊字符,具有特殊含義,但是有些情況下,只想表達字符自身,則需要轉義,即在字符前加反斜線。對于一般形式的量詞{n,m},雖然含有特殊含義的字符不止一個,但轉義時只需要給{添加反斜線即可,如需要匹配{n,m},則是{n,m}。
表:各種量詞的轉義
注意:忽略優先字符不像一般形式字符{n,m}一樣,只需要添加一個反斜線,如*?,必須都要添加反斜線,即正則表達式必須寫作:*?,而不是*?,后者的意思是“*這個字符有可能出現,有可能不出現”。
量詞 轉義形式 * * + + ? ? *? *? +? +? ?? ?? {n} {n} {n,m} {n,m} {n,} {n,} {,m} {,m} 除此之外,元字符點.也需要加反斜線來進行轉義。
由于點.表示除了換行符之外的字符,也包括點號(.),所以很多人忽略了對其轉義,但如果忽略了對其轉義,則在嚴格匹配點號時會出錯。比如匹配小數(3.14)、IP地址(192.168.1.1)、Email地址(some@host.com)等,所以若是要匹配的文本包含點號,一定不要忘了對其進行轉義,否則會出現如下的出錯:/^d+.d+$/.test("3.14") // => true /^d+.d+$/.test("3@14") // => true /^d+.d+$/.test("3.14") // => true /^d+.d+$/.test("3@14") // => false正則分析1、密碼長度在6-12個字符之間
2、只能由小寫字母,數字和橫線組成
3、開頭和結尾不能為橫線
4、不能全部為數字
5、不允許有連續(2個及以上)的橫線文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94771.html
摘要:本篇主要解疑正則表達式的占有型量詞。貪婪型結果在不做任何額外處理情況下,正則表達式默認是貪婪型的。結果皆為注意括號。說點什么占有量詞是一種用來組織正則表達式嘗試所有排列組合的方式。 針對*、+、?等限定符都是貪婪的(盡可能多的匹配字符),通過在最后追加+或?量詞可改變貪婪性。本篇主要解疑正則表達式的占有型量詞(Possessive Quantifiers)。 Greediness(貪婪...
摘要:近幾日對自己一直不太擅長的正則表達式做了一次全面的掃盲。量詞在正則中,通常要表示一個表達式匹配的數量,這個時候量詞就登場了。而正則默認是貪婪模式的。正則會默認對捕獲組分配組數。 近幾日對自己一直不太擅長的正則表達式做了一次全面的掃盲。心疼自己之余還是有一些收獲吧,在這里做一個比較零散的總結,整理一些對理解正則比較有利的點。 一、? 你沒有看錯,就是黑人問號中的問號,這個字符在正則里面算...
摘要:寫一個正則表達式來測試變量中是否包含字符串。用函數給出不使用字符,但和等價的正則表達式。第十四課標志全局匹配標志第二個常用的標志是全局匹配標志,用字母表示。寫出一個正則表達式來檢驗合法性。非捕獲組的主要用途是給一個組賦予量詞。 TRY REGEX 是一個交互式的正則表達式學習項目項目地址:https://github.com/callumacra...在線地址:http://tryre...
閱讀 1739·2021-09-26 09:46
閱讀 3017·2021-09-22 15:55
閱讀 2608·2019-08-30 14:17
閱讀 3027·2019-08-26 11:59
閱讀 1809·2019-08-26 11:35
閱讀 3155·2019-08-26 10:45
閱讀 3152·2019-08-23 18:28
閱讀 1106·2019-08-23 18:21