正則表達式(2)---匹配規則

原創文章,轉載請註明出處
正則表達式(1)---語法講解

前言

第一節講解了正則表達式的語法結構,由於內容過多,採用表格的方式敘述,但是在給其他人看的人的時候。都反應過於繁瑣。所以,根據自己一邊琢磨一邊在線測試得出一些心得。整理後分享與諸君。

小胖子

這裏我們會使用一個在線正則表達式測試網站:http://tool.oschina.net/regex/#

基本模式匹配

一切從最基本的開始。模式,是正規表達式最基本的元素,它們是一組描述字符串特徵的字符。模式可以很簡單,由普通的字符串組成,也可以非常複雜,往往用特殊的字符表示一個範圍內的字符、重複出現,或表示上下文。例如:

句子:once upon a timeThere 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 powerthe 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 wormwe 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]$

理解上面的知識點後我們不能說可以完全獨立寫出自己的表達式。但是已經可以很好的閱讀正則表達式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章