首頁  >  文章  >  後端開發  >  正規表示式詳細基礎實例解析

正規表示式詳細基礎實例解析

王林
王林轉載
2019-08-29 11:57:422201瀏覽

正規表示式是我們驗證是經常見到的!下面我和大家一起分享如何更簡單的理解正規表示式。
首先,說一下正規名字的命名:

這個字我想大家都會眼熟吧! 「Regular Expression」。  Regular Expression的「Regular」一般被翻譯為「正規」、「正規」、「常規」。這裡的「Regular」是「規則」、「規律」的意思,Regular Expression即「描述某種規則的表達式」之意,也就是我們所說的正規表示式。其實正規表示式說白了就是用來規範某種行為的!或者說是一種約束,就好比我們必須遵守交通規則是的。
我個人感覺如果想把正則搞懂、搞懂也不難!只要把其中的一些必須記住的東西外,再加上靈活的運用,這樣就可以了!
好的!接下來我就來深入到正規的主體,
我們來先看看正規關鍵的東西,如果把這些東西都搞懂了!一般在專案中就沒有問題了!

第一個「\」
這個是俗稱轉義字符,就是把一個字符標記為一個特殊字符或原義字符。如:「n」 就是要配對「n」  。如果是「\n」  則是換行符號。
有人該問如果我就是想寫「\」這個斜線呢?這個也很簡單啊!就直接是這樣寫「\\」就可以了!為什麼要寫兩個「\\」呢!就是為了區分。

第二個「^」
這個是俗稱開始字符,就是說準備寫正則了!如果設定了RegExp物件的Multiline屬性,^也符合「\n」或「\r」之後的位置。

第三個「$」
這個是俗稱結束字符,也可以說成收尾(很不專業的解釋)!如果設定了RegExp物件的Multiline屬性,$也符合「\n」或「\r」之前的位置

第四個「*」
這個是符合前面的子表達式零次或多次。如:zo*能匹配“z”以及“zo”或“zoo”。這個「*」也就是相當於{0,}

第五個「 」
這個是符合前面的子表達式一次或多次。如:「zo 」能匹配「zo」以及「zoo」或「zooo」。這個「*」和「 」差不多一個是開始零次一個是一次。這個「 」相當於{1,}。

第六個「?」
這個是符合前面的子運算式零次或一次。如:「do(es)?」可以符合「do」或「does」。這個問號的意思就是要嘛配對零次要嘛匹配一次!

第七個「{}」
這個符號是配對多少次的,
1,{n}匹配確定的n次,n是一個非負整數,如:「o{2}」這個的意思就是配對兩個「oo」, 如: good,food等!不過不能匹配body,因為就一個o!
2,{n,}匹配至少n次,n是個非負整數,如:“o{2,}” 這個的意思是匹配兩個以上的“oo”,如:good,goood,gooood等。 「o{1,}」等價於「o 」。 「o{0,}」這個等價於「o*」。
3,{n,m}這個是最少匹配n次最多匹配m次,n和m都是非負整數,其中n<=m。例如:「o{1,3}」匹配body,food,foood。不過不匹配fooood。 「o{0,1}」等價於「o?」。這裡寫的時候要注意一下,就是逗號和兩個數字之間不能有空格。

第八個「?」特殊用法
當字元緊接在任何其他限制符(*, ,?,{n},{n, },{n,m})後面時,配對模式是非貪婪的。所謂非貪婪就是以最少為好,非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對於字串“oooo”,“o ?”將符合單一“o”,而“o ”將符合所有“o”。

第九個「.」
符合除換行符「\n」之外的任何單一字元。如果想要匹配換行符「\n」再內的任何字符,就使用「(.|\n)」的模式。

第十個「pattern」
這個「pattern」不是很好理解,剛一看比較暈!不過我對這個的理解如下希望對大家有用:
1. ?:pattern 匹配pattern但不獲取匹配結果, 例如:k(?:1|2|3) k在123中任意匹配一個,例子: k1|k2
2. ?=pattern 正向肯定預查例如:K(?=1|2|3) 當K符合123任一時選擇K  例:k1中的k或k2中的k
3. ?!pattern 正向否定預查例如:k(?!1|2|3) 當K不匹配123中的任一個時選擇K 例子:不匹配k1中的k,不過可以是k4, k5
4. ?<=pattern 反向肯定預查例如:(?<=1|2|3)k 當K符合123中任一時選擇K 範例:1k中的k或2k中的K
5. ?

第十一個「|」
這個符號就是或的意思,例如:「f|good」能匹配「f」或「好」,如果這樣呢「(f| g)ood」則符合「food」或「good」。

第十二個「[]」 
這個符號是字元集和的意思,和「{}」看起來差不多,不過意義可就差多了。

第十三個「()」
這個符號式陣列或是集合

1、[xyz]  匹配所包含的任一個字元。是說三個之中選擇一個。例:「[abc]」可以符合「company」中的「a」不過不可以符合「beautiful」因為用到了裡面的兩個字母。
2、[^xyz] 這個是負值字元集合,也可以說成是「非」。例:「[^abc]」可以匹配「drop」等!只要單字裡沒有「abc」這三個字母就可以。
3、[a-z] 字元的範圍。符合指定範圍內的任意字元。例如,「[a-z]」可以符合「a」到「z」範圍內的任意小寫字母字元。也可以寫成“[0-9]”這個是匹配0到9直接打數字。
4、[^a-z] 這個我想不用說大家就應該想到是什麼意思了,對了!就是你想的那個意思:不在“a”到“z”範圍內的任意字符,一開始我看到這個的時候以為是不在a到z之間的字母!我說如果不在a到z之間的字母那隻有漢語中的“ü” 了!這個好像讀「喻」!呵呵!大家看清楚了啊!是字符,不是字母。

下面大家和我一起看看「\」和字母所匹配的特殊意義,
「\b」 這個是匹配一個單字的邊界,也就是指單字和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。這個我覺得比較好記大家可以這樣記:邊界的邊是b開頭的!
“\B”這個是和“\b”是相反的,匹配非單字邊界。 “er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
「\d」這個是用的比較多!我建議大家對這個多記記,這個是匹配數字字符,相當於[0-9]。
「\D」這個也很好理解,也是相反的意思就是說不是數字的,相當於[^0-9]。
“\f”這個是符合一個換頁符號。這個不做過多解釋了!下面的四個也就太多不做太多解釋了。只要記住就可以了!在專案中會用就可以了!
“\n”這個是符合一個換行符號。
“\r”這個是符合一個回車符。
“\t”這個是符合一個製表符。
“\v”這個是符合一個垂直製表符。
“\s”這個匹配任何空字符,匹配任何空白字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。也就是這個把上面的五個都包括在內了!
“\S”這個是非空白字元等價於[^ \f\n\r\t\v]。
說到這裡大家都可能感覺到正規其實就是這些字元嘛!而且有些是可以靠我們的邏輯思考推理出來的,而且有些是重複的,只要大家能夠靈活的運用就可以了。

“\w”這個是匹配包括下劃線的任何單字字元。等價於「[A-Za-z0-9_]」。這個實際用的也挺多的也建議大家多記記這個。

“\W”這個是匹配非單字數字字元。等價於「[^A-Za-z0-9_]」。

好的!基本上要記得就是這麼多了!這些可能有些正則高手該說了「你這個根本不全啊?」 我先提前解釋一下吧,我所寫的只是一些基礎的,在項目中常見的,比較實用的,基本上這些在項目中就可以運用自如了。
接下來呢,跟大家做一些實質的東西,跟大家一起解析一些正規表示式。
例如這個正規:^([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0 -9])$
這個正規我想對正規高手來說一看就知道是什麼了。當然一些邏輯思維比較強的看兩眼也就知道這個是什麼了,沒錯就是時間正則。

OK 我們來解析這個正規從這個「^」開始,「([0-1]?[0-9]|2[0-3])」是個組,「[0-1 ]?」這個問號的作用是0或1最多有零個或一個,「[0-9]」0至9之間任一個數,「|」這個是「或」的意思,就是說不是「[ 0-1]?[0-9]”就是“2[0-3]”,“2[0-3]” 這個是前面的2就是代表2,後面0至3是0到3之間任一個數,「:」就是代表「:」,「([0-5][0-9])」也是個組,「[0-5]」是0到5之間任一個數,「[0- 9]」是0到9之間任一個數,「:」也是本意,「([0-5][0-9])」也是個組,「[0-5]」是0到5之間任一個數,「[0-9]」是0到9之間任一個數,「$」這個是結束符。
再跟大家解析一個小數

例如:^[1-9] \d*(\.[0-9]{1,2})?|0(\.[0-9]{1,2})?$ 
「^」是開始符,「[1-9] 」其中「 」的意思是1到9之間最少有一個或多個,「\d*」這個「\d」是數字,這個「*」是最少有零個數字或多個數字,「(\.[0-9]{1,2})?」這組裡面「\.」是原意點,「[0-9]{1,2} 」 0到9之間有一個或有兩個數字,後面這個問號「?」意思是有零個或一個它「(\.[0-9]{1,2})」。 「|」 是「[1-9] \d*(\.[0-9]{1,2})?」或是「0(\.[0-9]{1,2})? 」。 「0(\.[0-9]{1,2})?」這裡面的0是原意,「(\.[0-9]{1,2})?」這組裡面「\.」是原意點,「[0-9]{1,2}」 0到9之間有一個或有兩個數字,後面這個問號「?」意思是有零個或一個它「(\.[0-9 ]{1,2})」。

下面我例舉出一些常見的正規表示式來給大家說說:

^[1-9]\d*$ //匹配正整數
^-[ 1-9]\d*$ //匹配負整數
^-?[1-9]\d*$ //匹配整數
^[1-9]\d*|0$ //匹配非負整數(正整數0)   
^-[1-9]\d*|0$ //匹配非正整數(負整數0)   
^[1-9]\d*\.\ d*|0\.\d*[1-9]\d*$ //符合正浮點數
^-([1-9]\d*\.\d*|0\.\d* [1-9]\d*)$ //符合負浮點數
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d *|0?\.0 |0)$ //符合浮點數
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0 ?\.0 |0$ //符合非負浮點數(正浮點數0)   
^(-([1-9]\d*\.\d*|0\.\d*[1- 9]\d*))|0?\.0 |0$ //匹配非正浮點數(負浮點數0)
^[a-zA-Z][a-zA-Z0-9_]{ 4,15}$  //符合帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線)
^\s*|\s*$  //匹配首尾空白字元的正規表示式
\n\s*\r  //符合空白行的正規表示式
[^\x00-\xff]  //符合雙位元組字元(包括漢字在內)
[\u4e00-\ u9fa5]  //符合中文字元的正規表示式

使用者名稱
^[a-z0-9_-]{3,16}$

密碼
^[a -z0-9_-]{6,18}$

十六進位值
^#?([a-f0-9]{6}|[a-f0-9]{3 })$

電子郵件
^([a-z0-9_\.-] )@([\da-z\.-] )\.([a-z\.]{2, 6})$
^[a-z\d] (\.[a-z\d] )*@([\da-z](-[\da-z])?) (\.{1,2} [a-z] ) $

URL
^(https?:\/\/)?([\da-z\.-] )\.([a-z\.]{2,6} )([\/\w \.-]*)*\/?$

IP 位址
((2[0-4]\d|25[0-5]|[01] ?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)


^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(? :25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

HTML 標籤
^< ;([a-z] )([^<] )*(?:>(.*)<\/\1>|\s \/>)$

以上便是關於正則表達式的一些基礎知識配合實際例子的講解,希望可以幫助到對正規表示式感到迷惑的同學,如有錯誤請指出。

更多相關問題請造訪PHP中文網:PHP影片教學

以上是正規表示式詳細基礎實例解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除