目前,正則表達式已經在很多軟件中得到廣泛的應用,包括*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"與換行符匹配。序列"http://"與"/"匹配,"/("與"("匹配。
^ :匹配輸入的開始位置。
$ :匹配輸入的結尾。
* :匹配前一個字符零次或幾次。例如,"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 碼。
好了,現在我們就舉個例子來說明正則表達式的使用,以驗證郵件。例如我們輸入:
test@yesky.com
,當然我也會這樣輸入:
xxx@yyy.com.cn
;但是這樣的則是非法,如:
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郵箱也可以 |
匹配的例子 | aaa@msn.com |
不匹配的例子 | 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位
|
匹配的例子 | |
不匹配的例子 |
驗證護照 | |
表達式 |
(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次以上
$:匹配結尾
在網上搜集并學習了多個較為經典的正則表達式資料版本后,總結了此篇學習心得,其中難免有不當或錯誤之處,還請各位多多斧正和指點
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
