正則表示式(2)---匹配規則
原創文章,轉載請註明出處
ofollow,noindex">正則表示式(1)---語法講解前言
第一節講解了正則表示式的語法結構,由於內容過多,採用表格的方式敘述,但是在給其他人看的人的時候。都反應過於繁瑣。所以,根據自己一邊琢磨一邊線上測試得出一些心得。整理後分享與諸君。

小胖子
基本模式匹配
一切從最基本的開始。模式,是正規表示式最基本的元素,它們是一組描述字串特徵的字元。模式可以很簡單,由普通的字串組成,也可以非常複雜,往往用特殊的字元表示一個範圍內的字元、重複出現,或表示上下文。例如:
句子: once upon a time 和 There once was a man from NewYork
正則表示式: ^once

測試1.png

測試2.png
(建議自己去敲一下,體會不一樣)
這個模式包含一個特殊的字元^,表示該模式只匹配那些以once開頭的字串。例如該模式與字串"once upon a time"匹配,與"There once was a man from NewYork"不匹配。正如如^符號表示開頭一樣,$符號用來匹配那些以給定模式結尾的字串。
句子: love give us power 和 the power produce war
正則表示式: power$

測試3.png

測試4.png
這個模式包含了一個特殊的字元$,表示該模式只匹配那些以power結尾的字串。例如該模式與字串“love give us power ”,與“the power produce war ”不匹配。
句子: engineer
正則表示式: ^engineer$

測試5.png

測試6.png
只匹配字串"engineer"。如果一個模式不包括^和$,那麼它與任何包含該模式的字串匹配。例如:模式
句子: The early bird catches the worm 和 we belive that the love may make the world more nice
正則表示式: the

測試7.png

測試8.png
可以匹配“The early bird catches the worm”和“we belive that the love may make the world more nice”
在該模式中的字母(t-h-e)是字面的字元,也就是說,他們表示該字母本身,數字也是一樣的。其他一些稍微複雜的字元,如標點符號和白字元(空格、製表符等),要用到轉義序列。所有的轉義序列都用反斜槓()打頭。空格的轉義序列是:\s。所以如果我們要檢測一個字串是否以製表符開頭,可以用這個模式:
句子: The early bird catches the worm (前面必須有空格符)
正則表示式: ^\s

測試9.png
其他一些製表符的使用請參考 正則表示式(1)---語法講解 中非列印字元的使用方法,酌情嘗試,請不要貪杯哦。
字元簇
前面的講解算的上開胃小菜,我們甚至不需要使用正則表示式就可以完成相應的業務,但是正則表示式這把宰牛刀的功能怎麼會如此簡單。那麼就開始進入一些更高難度的使用方法的講解。
在開發的程式中,正規表示式通常用來驗證使用者的輸入,一些後臺傳遞的資料的合理性。這裡的需求就在於,要判斷輸入的電話號碼、地址、EMAIL地址、信用卡號碼等是否有效,用普通的基於字面的字元是不夠的。
所以要用一種更自由的描述我們要的模式的辦法,它就是 字元簇 。要建立一個表示所有母音字元的字元簇,就把所有的母音字元放在一個方括號裡:
[AaEeIiOoUu]
這個模式雖然對於之前的模式有了很大的提升,但是僅能匹配一個字元,並且可以使用連字號來表示表示一個字元的範圍。最常用到的模式如下
[a-z] //匹配所有的小寫字母
[A-Z] //匹配所有的大寫字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的數字
[0-9.-] //匹配所有的數字,句號和減號
[ \f\r\t\n] //匹配所有的白字元(這個全用的情況較少)
同樣的,這些也只表示一個字元,這是一個非常重要的。如果要匹配一組個由一個大寫字母和一位數字組成的字串,比如"G2"、"S6"或"V7",但不是"ab2"、"r2d3" 或"b52"的話,用這個模式:
句子: G2 S6 V7
正則表示式: [A-Z][0-9]

測試10.png
如果限定格式僅僅為大寫字母+數字的格式,就使用定位符來限定,最終模式如下:
句子:G2
正則表示式: ^[A-Z][0-9]$

測試11.png
儘管[A-Z]代表26個字母的範圍,但在這裡它只能與第一個字元是大寫字母的字串匹配。
前面曾經提到
表示字串的開頭,但它還有另外一個含義。當在一組方括號裡使用
是,它表示"非"或"排除"的意思,常常用來剔除某個字元。還用前面的例子,我們要求第一個字元不能是數字:句子:G2
正則表示式: [ 0-9][0-9]$

測試12.png
我們在這裡再列出幾個常見的排除特定字元:
[^a-z] //除了小寫字母以外的所有字元
[^A-Z]//除了大寫字母以外的所有字元
[^0-9]//除了數字以外的所有字元
[^\/^] //除了()(/)(^)之外的所有字元
[^"'] //除了雙引號(")和單引號(')之外的所有字元
附帶提一下特殊字元"." (點,句號)在正規表示式中用來表示除了"新行"之外的所有字元。所以模式"^.5$"與任何兩個字元的、以數字5結尾和以其他非"新行"字元開頭的字串匹配。模式"."可以匹配任何字串,除了空串和只包括一個"新行"的字串。
確定重複出現
到現在為止,我們已經知道如何去匹配一個字母或數字,但更多的情況下,可能要匹配一個單詞或一組數字。一個單詞有若干個字母組成,一組數字有若干個單陣列成。跟在字元或字元簇後面的花括號({})用來確定前面的內容的重複出現的次數。
字元簇 | 描述 |
---|---|
^[a-zA-Z_]$ | 所有的字母和下劃線 |
^a$ | 字母a |
^a{4}$ | aaaa |
^a{2,4}$ | aa,aaa或aaaa |
^a{1,3}$ | a,aa或aaa |
^a{2,}$ | 包含多於兩個a的字串 |
^a{2,} | 如:aardvark和aaab,但apple不行 |
a{2,} | 如:baad和aaa,但Nantucket不行 |
\t{2} | 兩個製表符 |
.{2} | 所有的兩個字元 |
這些例子描述了花括號的三種不同的用法。一個數字,{x}的意思是"前面的字元或字元簇只出現x次";一個數字加逗號,{x,}的意思是"前面的內容出現x或更多的次數";兩個用逗號分隔的數字,{x,y}表示"前面的內容至少出現x次,但不超過y次"。我們在這裡講解一個較難的模式:
^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ //所有的小數
其中:^-{0,1}代表可為正或負號
[0-9]{0,}代表整數部分
.{0,1}小數點.可以不存在(整數也是小數的一種)
[0-9]{0,}小數點.後的部分
由於特殊字元"?"與{0,1}是相等的,它們都代表著:"0個或1個前面的內容"或"前面的內容是可選的"。所以剛才的例子可以簡化為:
^-?[0-9]{0,}.?[0,9]{0,}$
由於特殊字元"*"與{0,}是相等的,它們都代表著"0個或多個前面的內容"。最後,字元"+"與 {1,}是相等的,表示"1個或多個前面的內容",所以我們可以將上面的例子繼續簡化:
^-?[0-9] .?[0,9] $
理解上面的知識點後我們不能說可以完全獨立寫出自己的表示式。但是已經可以很好的閱讀正則表示式。