正則表達式的學習與小結

原文地址:http://blog.csdn.net/sunboy_2050/article/details/4962509


目前,正則表達式已經在很多軟件中得到廣泛的應用,包括*nix(Linux, Unix等),HP等操作系統,PHP,C#,Java等開發環境,以及很多的應用軟件中,都可以看到正則表達式的影子。

正則表達式的使用,可以通過簡單的辦法來實現強大的功能。爲了簡單有效而又不失強大,造成了正則表達式代碼的難度較大,學習起來也不是很容易,所以需要付出一些努力才行,入門之後參照一定的參考,使用起來還是比較簡單有效的。

 

正則表達式可以: 
1. 測試字符串的某個模式,例如可以對一個輸入字符串進行測試,看該字符串是否存在一個電話號碼的模式,這稱爲數據有效性驗證
2. 替換文本,可以在文檔中使用一個正則表達式來標識特定文字,然後可以全部將其刪除,或者替換爲別的文字
3. 根據模式匹配從字符串中提取一個子字符串,可以用來在文本或輸入字段中查找特定文字

 

正則表達式的常用字符及其含義

正則表達式字符

描述

 [……]

匹配括號中的任何一個字符

 [^……]

匹配不在括號中的任何一個字符(^爲取反符)

 /w

匹配任何一個字符(a~z、A~Z和0~9)

 /W

匹配任何一個空白字符

 /s

匹配任何一個非空白字符

 /S

與任何非單詞字符匹配

 /d

匹配任何一個數字(0~9)

 /D

匹配任何一個非數字(^0~9)

 [/b]

匹配一個退格鍵字母

 {n,m}

最少匹配前面表達式n次,最大爲m次(n-m次數範圍)

 {n,}

最少匹配前面表達式n次(上限不定)

 {n}

恰恰匹配前面表達式爲n次

 ?

匹配前面表達式0或1次,即{0,1}

 +

至少匹配前面表達式1次,即{1,}

 *

至少匹配前面表達式0次,即{0,}

 |

匹配前面表達式或後面表達式(邏輯或)

 (…)

在單元中組合項目

 ^

匹配字符串的開頭

 $

匹配字符串的結尾

 /b

匹配字符邊界

 /B

匹配非字符邊界的某個位置

 

幾個常用的正則表達式

  • /w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*:驗證電子郵件:
  • HTTP:///S+/./S+:驗證網址:
  • /d{6}:驗證郵政編碼:
  • [0-9]:表示0~9十個數字。
  • /d*:表示任意個數字。
  • /d{3,4}-/d{7,8}:表示中國大陸的固定電話號碼。
  • /d{2}-/d{5}:驗證由兩位數字、一個連字符再加5位數字組成的ID號。
  • </s*(/S+)(/s[^>]*)?>[/s/S]*</s*///l/s*>:匹配HTML標記。
  • /d{17}[/d|X]|/d{15}:身份證


字符描述:

/:將下一個字符標記爲特殊字符或字面值。例如"n"與字符"n"匹配。"/n"與換行符匹配。序列"//"與"/"匹配,"/("與"("匹配。
^ :匹配輸入的開始位置。 
$ :匹配輸入的結尾。 
* :匹配前一個字符零次或幾次。例如,"zo*"可以匹配"zo"、"zoo"。 
+ :匹配前一個字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。 
? :匹配前一個字符零次或一次。例如,"n?ve?"可以匹配"never"中的"ve"。 
.:匹配換行符以外的任何字符。 
(pattern) 與模式匹配並記住匹配。匹配的子字符串可以從作爲結果的

Matches 集合中使用 Item [0]...[n]取得。如果要匹配括號字符(和 ),可使用"/(" 或 "/)"。 
x|y:匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zood" 或 "food"。 
{n}:n 爲非負的整數,匹配恰好n次。例如,"o{2}" 不能與 "Bob 中的 "o" 匹配,但是可以與"foooood"中的前兩個o匹配。 
{n,} :n 爲非負的整數,匹配至少n次。例如,"o{2,}"匹配"foooood"中所有的o,"o{1,}"等價於"o+";"o{0,}"等價於"o*"。 
{n,m} :m 和 n 爲非負的整數。匹配至少 n 次,至多 m 次。例如,"o{1,3}" 匹配 "fooooood"中前三個o,"o{0,1}"等價於"o?"。 
[xyz] :一個字符集,與括號中字符的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。 
[^xyz] :一個否定的字符集,匹配不在此括號中的任何字符。例如,"[^abc]" 可以匹配"plain"中的"p". 
[a-z] :表示某個範圍內的字符,與指定區間內的任何字符匹配。例如,"[a-z]"匹配"a"與"z"之間的任何一個小寫字母字符。 
[^m-z] :否定的字符區間,與不在指定區間內的字符匹配。例如,"[m-z]"與不在"m"到"z"之間的任何字符匹配。 
/b :與單詞的邊界匹配,即單詞與空格之間的位置。例如,"er/b" 與"never"中的"er"匹配,但是不匹配"verb"中的"er"。 
/B :與非單詞邊界匹配,"ea*r/B"與"never early"中的"ear"匹配。 
/d :與一個數字字符匹配,等價於[0-9]。 
/D :與非數字的字符匹配,等價於[^0-9]。 
/f :與分頁符匹配。 
/n :與換行符字符匹配。 
/r :與回車字符匹配。 
/s :與任何白字符匹配,包括空格、製表符、分頁符等。等價於"[ /f/n/r/t/v]"。 
/S :與任何非空白的字符匹配,等價於"[^ /f/n/r/t/v]"。 
/t :與製表符匹配。 
/v :與垂直製表符匹配。 
/w :與任何單詞字符匹配,包括下劃線。等價於"[A-Za-z0-9_]"。 
/W :與任何非單詞字符匹配,等價於"[^A-Za-z0-9_]"。 
/num :匹配 num個,其中 num 爲一個正整數,引用回到記住的匹配。例如,"(.)/1"匹配兩個連續的相同的字符。 
/n:匹配 n,其中n 是一個八進制換碼值。八進制換碼值必須是 1, 2 或 3 個數字長。

例如,"/11" 和 "/011" 都與一個製表符匹配。"/0011"等價於"/001" 與 "1"。八進制換碼值不得超過 256。否則,只有前兩個字符被視爲表達式的一部分。允許在正則表達式中使用ASCII碼。 
/xn:匹配n,其中n是一個十六進制的換碼值。十六進制換碼值必須恰好爲兩個數字長。例如,"/x41"匹配"A"。"/x041"等價於"/x04" 和 "1"。允許在正則表達式中使用 ASCII 碼。 

好了,現在我們就舉個例子來說明正則表達式的使用,以驗證郵件。例如我們輸入:[email protected],當然我也會這樣輸入:[email protected];但是這樣的則是非法,如:xxx@@com.cn或者@xxx.com.cn,等等,所以我們得歸納出合法的電子郵件地址應滿足的條件: 
1. 必須包含一個並且只有一個符號“@” 
2. 第一個字符不得是“@”或者“.” 
3. 不允許出現“@.”或者.@ 
4. 結尾不得是字符“@”或者“.” 
根據以上的原則,我們就可以得到如下的模板: "^/w+((-/w+)|(/./w+))*/@[A-Za-z0-9]+((/.|-)[A-Za-z0-9]+)*/.[A-Za-z0-9]+$"

接着,我們對其改進,可以得到這樣的模板格式:"/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*"

 

正則表達式的常見用法

"^/d+$":非負整數(正整數 + 0)

"^[0-9]*[1-9][0-9]*$":正整數

"^((-/d+)|(0+))$"非正整數(負整數 + 0)

"^-[0-9]*[1-9][0-9]*$":負整數

"^-?/d+$"整數

"^/d+(/./d+)?$"非負浮點數(正浮點數 + 0)

"^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$"正浮點數

"^((-/d+(/./d+)?)|(0+(/.0+)?))$"非正浮點數(負浮點數 + 0)

"^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$":負浮點數

"^(-?/d+)(/./d+)?$"浮點數

"^[A-Za-z]+$"由26個英文字母組成的字符串

"^[A-Z]+$"由26個英文字母的大寫組成的字符串

"^[a-z]+$"由26個英文字母的小寫組成的字符串

"^[A-Za-z0-9]+$"由數字和26個英文字母組成的字符串

"^/w+$"由數字、26個英文字母或者下劃線組成的字符串

"^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$"email地址

"^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$"url

只能輸入1個數字
表達式 ^/d$
描述 匹配一個數字(^起始符,$結束符,下同)
匹配的例子 0,1,2,3
不匹配的例子

只能輸入n個數字
表達式 ^/d{n}$ 例如^/d{8}$
描述 匹配8個數字
匹配的例子 12345678,22223334,12344321
不匹配的例子

只能輸入至少n個數字
表達式 ^/d{n,}$ 例如^/d{8,}$
描述 匹配最少n個數字
匹配的例子 12345678,123456789,12344321
不匹配的例子

只能輸入m到n個數字
表達式 ^/d{m,n}$ 例如^/d{7,8}$
描述 匹配m到n個數字
匹配的例子 12345678,1234567
不匹配的例子 123456,123456789

只能輸入數字
表達式 ^[0-9]*$
描述 匹配任意個數字
匹配的例子 12345678,1234567
不匹配的例子 E,清清月兒,http://blog.csdn.net/21aspnet

只能輸入某個區間數字
表達式 ^[12-15]$
描述 匹配某個區間的數字
匹配的例子 12,13,14,15
不匹配的例子

只能輸入0和非0打頭的數字
表達式 ^(0|[1-9][0-9]*)$
描述 可以爲0,第一個數字不能爲0,數字中可以有0
匹配的例子 12,10,101,100
不匹配的例子 01,清清月兒,http://blog.csdn.net/21aspnet

只能輸入實數
表達式 ^[-+]?/d+(/./d+)?$
描述 匹配實數
匹配的例子 18,+3.14,-9.90
不匹配的例子 .6,33s,67-99

只能輸入n位小數的正實數
表達式 ^[0-9]+(.[0-9]{n})?$以^[0-9]+(.[0-9]{2})?$爲例
描述 匹配n位小數的正實數
匹配的例子 2.22
不匹配的例子 2.222,-2.22,http://blog.csdn.net/21aspnet

只能輸入m-n位小數的正實數
表達式 ^[0-9]+(.[0-9]{m,n})?$以^[0-9]+(.[0-9]{1,2})?$爲例
描述 匹配m到n位小數的正實數
匹配的例子 2.22,2.2
不匹配的例子 2.222,-2.2222,http://blog.csdn.net/21aspnet

只能輸入非0的正整數
表達式 ^/+?[1-9][0-9]*$
描述 匹配非0的正整數
匹配的例子 2,23,234
不匹配的例子 0,-4,

只能輸入非0的負整數
表達式 ^/-[1-9][0-9]*$
描述 匹配非0的負整數
匹配的例子 -2,-23,-234
不匹配的例子 0,4,

只能輸入n個字符
表達式 ^.{n}$ 以^.{4}$爲例
描述 匹配n個字符,注意漢字只算1個字符
匹配的例子 1234,12we,123清,清清月兒
不匹配的例子 0,123,123www,http://blog.csdn.net/21aspnet/

只能輸入英文字符
表達式 ^.[A-Za-z]+$爲例
描述 匹配英文字符,大小寫任意
匹配的例子 Asp,WWW,
不匹配的例子 0,123,123www,http://blog.csdn.net/21aspnet/

只能輸入大寫英文字符
表達式 ^.[A-Z]+$爲例
描述 匹配英文大寫字符
匹配的例子 NET,WWW,
不匹配的例子 0,123,123www,

只能輸入小寫英文字符
表達式 ^.[a-z]+$爲例
描述 匹配英文大寫字符
匹配的例子 asp,csdn
不匹配的例子 0,NET,WWW,

只能輸入英文字符+數字
表達式 ^.[A-Za-z0-9]+$爲例
描述 匹配英文字符+數字
匹配的例子 1Asp,W1W1W,
不匹配的例子 0,123,123,www,http://blog.csdn.net/21aspnet/

只能輸入英文字符/數字/下劃線
表達式 ^/w+$爲例
描述 匹配英文字符或數字或下劃線
匹配的例子 1Asp,WWW,12,1_w
不匹配的例子 3#,2-4,w#$,http://blog.csdn.net/21aspnet/

密碼舉例
表達式 ^.[a-zA-Z] /w{m,n}$
描述 匹配英文字符開頭的m-n位字符且只能數字字母或下劃線
匹配的例子  
不匹配的例子  

驗證首字母大寫
表達式 /b[^/Wa-z0-9_][^/WA-Z0-9_]*/b
描述 首字母只能大寫
匹配的例子 Asp,Net
不匹配的例子 http://blog.csdn.net/21aspnet/

驗證網址(帶?id=中文)VS.NET2005無此功能
表達式

^http:////([/w-]+(/.[/w-]+)+(//[/w-   .///?%&=/u4e00-/u9fa5]*)?)?$

描述 驗證帶?id=中文
匹配的例子 http://blog.csdn.net/21aspnet/ ,
http://blog.csdn.net?id=清清月兒
不匹配的例子  

驗證漢字
表達式 ^[/u4e00-/u9fa5]{0,}$
描述 只能漢字
匹配的例子 清清月兒
不匹配的例子 http://blog.csdn.net/21aspnet/

驗證QQ號
表達式 [0-9]{5,9}
描述 5-9位的QQ號
匹配的例子 10000,123456
不匹配的例子 10000w,http://blog.csdn.net/21aspnet/

驗證電子郵件(驗證MSN號一樣)
表達式 /w+([-+.']/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
描述 注意MSN用非hotmail.com郵箱也可以
匹配的例子 [email protected]
不匹配的例子 111@1.   http://blog.csdn.net/21aspnet/

驗證身份證號(粗驗,最好服務器端調類庫再細驗證)
表達式 ^[1-9]([0-9]{16}|[0-9]{13})[xX0-9]$
描述  
匹配的例子 15或者18位的身份證號,支持帶X的
不匹配的例子 http://blog.csdn.net/21aspnet/

驗證手機號(包含159,不包含小靈通)
表達式 ^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8}
描述 包含159的手機號130-139
匹配的例子 139XXXXXXXX
不匹配的例子 140XXXXXXXX,http://blog.csdn.net/21aspnet/

驗證電話號碼號(很複雜,VS.NET2005給的是錯的)
表達式(不完美 ) 方案一 ((/(/d{3}/)|/d{3}-)|(/(/d{4}/)|/d{4}-))?(/d{8}|/d{7})
方案二 (^[0-9]{3,4}/-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^/([0-9]{3,4}/)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)    支持手機號但也不完美
描述

上海:02112345678    3+8位
上海:021-12345678
上海:(021)-12345678
上海:(021)12345678
鄭州:03711234567     4+7位
杭州:057112345678     4+8位
還有帶上分機號,國家碼的情況
由於情況非常複雜所以不建議前臺做100%驗證,到目前爲止似乎也沒有誰能寫一個包含所有的類型 ,其實有很多情況本身就是矛盾的。
如果誰有更好 的驗證電話的請留言

匹配的例子  
不匹配的例子  

驗證護照
表達式

(P/d{7})|G/d{8})

描述 驗證P+7個數字和G+8個數字
匹配的例子  
不匹配的例子 清清月兒, http://blog.csdn.net/21aspnet/

驗證IP
表達式

^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])/.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)/.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)/.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$

描述 驗證IP
匹配的例子 192.168.0.1    222.234.1.4
不匹配的例子

驗證域
表達式

^[a-zA-Z0-9]+([a-zA-Z0-9/-/.]+)?/.(com|org|net|cn|com.cn|edu.cn|grv.cn|)$

描述 驗證域
匹配的例子 csdn.net   baidu.com it.com.cn
不匹配的例子 192.168.0.1 

驗證信用卡
表達式

^((?:4/d{3})|(?:5[1-5]/d{2})|(?:6011)|(?:3[68]/d{2})|(?:30[012345]/d))[ -]?(/d{4})[ -]?(/d{4})[ -]?(/d{4}|3[4,7]/d{13})$

描述 驗證VISA卡,萬事達卡,Discover卡,美國運通卡
匹配的例子  
不匹配的例子

驗證ISBN 國際標準書號
表達式

^(/d[- ]*){9}[/dxX]$

描述 驗證ISBN國際標準書號
匹配的例子 7-111-19947-2
不匹配的例子

驗證GUID 全球唯一標識符
表達式

^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$

描述 格式8-4-4-4-12
匹配的例子 2064d355-c0b9-41d8-9ef7-9d8b26524751
不匹配的例子

驗證文件路徑和擴展名
表達式

^([a-zA-Z]/:|//)//([^//]+//)*[^//:*?"<>|]+/.txt(l)?$

描述 檢查路徑和文件擴展名
匹配的例子 E:/mo.txt
不匹配的例子 E:/ , mo.doc, E:/mo.doc ,http://blog.csdn.net/21aspnet/

驗證Html顏色值
表達式

^#?([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$

描述 檢查顏色取值
匹配的例子 #FF0000
不匹配的例子 http://blog.csdn.net/21aspnet

 

 

 

 郵件地址最基本的格式可以看作是 <用戶名@域名>。對於用戶名,各個ISP沒有統一的標準,除了數字和字母外,有的允許有<_>,有的允許有<.>,也有的兩者皆可,或者允許其他的特殊字符。對此我們只能根據具體的情況加以判斷。
文中假設除字母和數字外還允許<.><_>,<.><_>不能出現在首末位,<.><_>不能相連。域名中各段除數字和字母外只允許出現<->,且<->不能出現在首位和末位,各段用<.>連接。我們還可從域名得知最後一段大於一位且只有字母。
下面我們就可以依據以上假設寫出如下表達式來判斷是否該串是一個郵件地址:

^([a-z0-9A-Z]+[-|/.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?/.)+[a-zA-Z]{2,}$

稍作解釋:
^:匹配開始
([a-z0-9A-Z]+[-|/.]?)+:數字或字母>1位 + <->或<.>,以上組合重複1次以上
[a-z0-9A-Z]:用戶名以數字或字母結尾
@:匹配<@>
(
[a-z0-9A-Z]+:匹配多位數字或字母
(-[a-z0-9A-Z]+)?:匹配 -加多位數字或字母 0次或1次
/.:匹配<.>
)+:匹配括號中內容多次
[a-zA-Z]{2,}:匹配字母2次以上
$:匹配結尾

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