原創文章,轉載請註明出處
正則表達式(1)---語法講解
前言
第一節講解了正則表達式的語法結構,由於內容過多,採用表格的方式敘述,但是在給其他人看的人的時候。都反應過於繁瑣。所以,根據自己一邊琢磨一邊在線測試得出一些心得。整理後分享與諸君。
這裏我們會使用一個在線正則表達式測試網站:http://tool.oschina.net/regex/#
基本模式匹配
一切從最基本的開始。模式,是正規表達式最基本的元素,它們是一組描述字符串特徵的字符。模式可以很簡單,由普通的字符串組成,也可以非常複雜,往往用特殊的字符表示一個範圍內的字符、重複出現,或表示上下文。例如:
句子:once upon a time和There once was a man from NewYork
正則表達式:^once
(建議自己去敲一下,體會不一樣)
這個模式包含一個特殊的字符^,表示該模式只匹配那些以once開頭的字符串。例如該模式與字符串"once upon a time"匹配,與"There once was a man from NewYork"不匹配。正如如^符號表示開頭一樣,$符號用來匹配那些以給定模式結尾的字符串。
句子:love give us power和the power produce war
正則表達式:power$
這個模式包含了一個特殊的字符$,表示該模式只匹配那些以power結尾的字符串。例如該模式與字符串“love give us power ”,與“the power produce war ”不匹配。
句子:engineer
正則表達式:^engineer$
只匹配字符串"engineer"。如果一個模式不包括^和$,那麼它與任何包含該模式的字符串匹配。例如:模式
句子:The early bird catches the worm和we belive that the love may make the world more nice
正則表達式:the
可以匹配“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
其他一些製表符的使用請參考正則表達式(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]
如果限定格式僅僅爲大寫字母+數字的格式,就使用定位符來限定,最終模式如下:
句子:G2
正則表達式:^[A-Z][0-9]$
儘管[A-Z]代表26個字母的範圍,但在這裏它只能與第一個字符是大寫字母的字符串匹配。
前面曾經提到表示字符串的開頭,但它還有另外一個含義。當在一組方括號裏使用是,它表示"非"或"排除"的意思,常常用來剔除某個字符。還用前面的例子,我們要求第一個字符不能是數字:
句子:G2
正則表達式:[0-9][0-9]$
我們在這裏再列出幾個常見的排除特定字符:
[^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]$
理解上面的知識點後我們不能說可以完全獨立寫出自己的表達式。但是已經可以很好的閱讀正則表達式。