編程基礎 —— 正則表達式

字符優先級

相同優先級的從左到右進行運算,不同優先級的運算先高後低。

字符 描述 優先級
\ 轉義符
(), (?😃, (?=), [] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位點和序列(即:位置和順序)
| 替換,“或"操作
字符具有高於替換運算符的優先級,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",請使用括號創建子表達式,從而產生"(m|f)ood"。

元字符

字符 描述 類型
\ 將下個字符標記爲特殊字符/原義字符/向後引用/八進制
例:‘n’匹配"n"、’\n’匹配換行符、’\\'匹配"\"、"\(" 則匹配 “(”
轉義符
^ 匹配輸入字符串的開始位置
如設置了 RegExp 對象的 Multiline 屬性,也匹配’\n’或’\r’之後的位置
除了在方括號表達式中使用,此時它表示不接受該字符集合
定位符
$ 匹配輸入字符串的結束位置
如果設置了RegExp 對象的 Multiline 屬性,匹配’\n’或’\r’之前的位置
定位符
* 匹配前面的子表達式零次或多次
例如,zo* 能匹配 “z” 以及 “zoo”。等價於{0,}
限定符
+ 匹配前面的子表達式一次或多次
例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。等價於 {1,}
限定符
? 匹配前面的子表達式零次或一次
例如,“do(es)?” 可以匹配 “do” 或 “does” 。等價於 {0,1}
限定符
{n} n 是非負整數。匹配確定的 n 次
例: 'o{2}‘不能匹配"Bob"中的’o’,但能匹配"food"中的兩個 o
限定符
{n,} n 是一個非負整數。至少匹配n 次
例: ‘o{2,}‘不能匹配"Bob"中的’o’,但能匹配"foooood"中的所有 o
’o{1,}’ 等價於 ‘o+’。‘o{0,}’ 則等價於 ‘o*’
限定符
{n,m} m 和 n 均爲非負整數,n <= m。最少匹配 n 次且最多匹配 m 次
例: “o{1,3}” 將匹配 “fooooood” 中的前三個 o
’o{0,1}’ 等價於 ‘o?’。請注意在逗號和兩個數之間不能有空格
限定符
? 在限定符(*, +, ?, {n}, {n,}, {n,m})後面時,匹配模式是非貪婪的
非貪婪模式儘可能少的匹配所搜索的字符串
而默認的貪婪模式則儘可能多的匹配所搜索的字符串
例: 在"oooo"中’o+?'將匹配單個"o",而’o+‘將匹配所有’o’。
. 匹配除換行符(\n、\r)之外的任何單個字符
要匹配包括 ‘\n’ 在內的任何字符,請使用"(.|\n)"
(pattern) 匹配 pattern 並捕獲結果。結果從產生的 Matches 集合得到,
在 VBScript 中用 SubMatches 集合,在 JScript 中用 $0…$9 屬性
捕獲組
(?:pattern) 匹配 pattern 但不捕獲結果
在使用"|"字符來組合一個模式的其中一部分是很有用的
例: 'industr(?:y|ies) 比 ‘industry|industries’ 更簡略
非捕獲
(?=pattern) 正向肯定預查(look ahead positive assert)
在任何匹配pattern的字符串開始處匹配查找字符串
不捕獲結果
例: "Windows(?=95|98|NT|2000)"
匹配"Windows2000"中的"Windows"
不匹配"Windows3.1"中的"Windows"
預查不消耗字符,即在不包含預查結果的位置開始下一次搜索
非捕獲
(?!pattern) 正向否定預查(negative assert)
在任何不匹配pattern的字符串開始處匹配查找字符串
不捕獲結果
例: "Windows(?!95|98|NT|2000)"
匹配"Windows3.1"中的"Windows"
不匹配"Windows2000"中的"Windows"
預查不消耗字符(同上解釋)
非捕獲
(?<=pattern) 反向肯定預查(look behind)
與正向肯定預查類似,只是方向相反
例: “(?<=95|98|NT|2000)Windows"
匹配"2000Windows"中的"Windows"
不匹配"3.1Windows"中的"Windows”
非捕獲
(?<!pattern) 反向否定預查
與正向否定預查類似,只是方向相反
例: “(?<!95|98|NT|2000)Windows"
匹配"3.1Windows"中的"Windows"
不匹配"2000Windows"中的"Windows”
非捕獲
x|y 匹配 x 或 y
例: ‘z|food’ 能匹配 “z” 或 “food”
’(z|f)ood’ 則匹配 “zood” 或 “food”
[xyz] 字符集合。匹配所包含的任意一個字符
例: ‘[abc]’ 匹配 “plain” 中的 ‘a’
[^xyz] 負值字符集合。匹配未包含的任意字符
例: ‘[^abc]’ 匹配 “plain” 中的’p’、‘l’、‘i’、‘n’
[a-z] 字符範圍。匹配指定範圍內的任意字符
例: ‘[a-z]’ 匹配’a’到’z’範圍內的任意小寫字母字符
[^a-z] 負值字符範圍。匹配任何不在指定範圍內的任意字符
例: '[^a-z]'可以匹配任何不在’a’到’z’範圍內的任意字符
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置
例: ‘er\b’匹配"never"中的 ‘er’,但不匹配"verb"中的’er’
定位符
\B 匹配非單詞邊界
’er\B’匹配"verb"中的’er’,但不匹配"never"中的’er’
定位符
\cx 匹配由 x 指明的控制字符
例: \cM 匹配一個 Control-M 或回車符
x 的值必須爲 A-Z 或 a-z 之一。否則,將 c 視爲原義的’c’字符
\d 匹配一個數字字符。等價於 [0-9]
\D 匹配一個非數字字符。等價於 [^0-9]
\f 匹配一個換頁符。等價於 \x0c 和 \cL
\n 匹配一個換行符。等價於 \x0a 和 \cJ
\r 匹配一個回車符。等價於 \x0d 和 \cM
\s 匹配任何空白字符,包括空格、製表符、換頁符等等
等價於 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符
\S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]
\t 匹配一個製表符。等價於 \x09 和 \cI
\v 匹配一個垂直製表符。等價於 \x0b 和 \cK
\w 匹配字母、數字、下劃線。等價於’[A-Za-z0-9_]’
\W 匹配非字母、數字、下劃線。等價於 ‘[^A-Za-z0-9_]’
\xn 匹配 n,其中 n 爲十六進制轉義值
十六進制轉義值必須爲確定的兩個數字長
例: ‘\x41’ 匹配 “A”。’\x041’ 則等價於 ‘\x04’ & "1"
正則表達式中可以使用 ASCII 編碼
\num 匹配 num,其中 num 是一個正整數
是對所獲取的匹配的引用
例: ‘(.)\1’ 匹配兩個連續的相同字符
\n 標識一個八進制轉義值或一個向後引用
如果 \n 之前至少 n 個獲取的子表達式,則 n 爲向後引用
否則,如果 n 爲八進制數字 (0-7),則 n 爲一個八進制轉義值。
\nm 表示 八進制轉義值 或 向後引用
1其之前至少有 nm 個獲得子表達式,則 nm 爲向後引用
2其之前至少有 n 個獲取,則 n 爲一個後跟文字 m 的向後引用
3若 n 和 m 均爲八進制數字 (0-7),則將匹配八進制轉義值 nm
\nml 如 n 爲八進制數字 (0-7)
且 m 和 l 均爲八進制數字 (0-7)
則匹配八進制轉義值 nml
\un 匹配 n,其中 n 是用4個十六進制數字表示的 Unicode 字符
例: \u00A9 匹配版權符號(©)

字符簇

字符簇 描述
[a-z] 匹配所有的小寫字母
[A-Z] 匹配所有的大寫字母
[a-zA-Z] 匹配所有的字母
[0-9] 匹配所有的數字
[0-9.-] 匹配所有的數字,句號和減號
[ \f\r\t\n] 匹配所有的白字符
[^a-z] 除了小寫字母以外的所有字符
[^\/^] 除了()(/)(^)之外的所有字符
[^"’] 除了雙引號(")和單引號(’)之外的所有字符

PHP的正則表達式內置的通用字符簇

字符簇 描述
[[:alpha:]] 任何字母
[[:digit:]] 任何數字
[[:alnum:]] 任何字母和數字
[[:space:]] 任何空白字符
[[:upper:]] 任何大寫字母
[[:lower:]] 任何小寫字母
[[:punct:]] 任何標點符號
[[:xdigit:]] 任何16進制的數字,相當於[0-9a-fA-F]

確定重複出現

字符簇 描述
^[a-zA-Z_]$ 所有的字母和下劃線
^[[:alpha:]]{3}$ 所有的3個字母的單詞
^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} 所有的兩個字符
^[a-zA-Z0-9_]{1,}$ 所有包含一個以上的字母、數字或下劃線的字符串
同^[a-zA-Z0-9_]+$
^[1-9][0-9]{0,}$ 所有的正整數
同^[1-9][0-9]*$
^-{0,1}[0-9]{1,}$ 所有的整數
同^-?[0-9]+$
^[-]?[0-9]+.?[0-9]+$ 所有的浮點數
同^[-]?[0-9]+(.[0-9]+)?$

示例

正則表達式 描述
/\b([a-z]+) \1\b/gi 一個單詞連續出現的位置
/(\w+)😕/([^/:]+)(:\d*)?([^# ]*)/ 將一個URL解析爲協議、域、端口及相對路徑
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章節的位置
/[-a-z]/ a至z共26個字母再加一個-號
/ter\b/ 可匹配chapter,而不能匹配terminal
/\Bapt/ 可匹配chapter,而不能匹配aptitude
/Windows(?=95|98|NT)/ 可匹配Windows95或Windows98或WindowsNT,當找到一個匹配後,從Windows後面開始進行下一次的檢索匹配
/^\s*$/ 匹配空行
/\d{2}-\d{5}/ 驗證由兩位數字、一個連字符再加 5 位數字組成的 ID 號
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*/\1\s*>/ 匹配 HTML 標記

實用示例

正則表達式 匹配描述
/^[0-9]+([.][0-9]+){0,1}$/ 整數或者小數
/^[0-9]*$/ 只能輸入數字
/^\d{n}$/ 只能輸入n位的數字
/^\d{n,}$/ 只能輸入至少n位的數字
/^\d{m,n}$/ 只能輸入m~n位的數字
/^(0|[1-9][0-9]*)$/ 只能輸入零和非零開頭的數字
/^[0-9]+(.[0-9]{2})?$/ 只能輸入有兩位小數的正實數
/^[0-9]+(\.[0-9]{1,3})?$/ 只能輸入有1~3位小數的正實數
/^\+?[1-9][0-9]*$/ 只能輸入非零的正整數
/^\-[1-9][0-9]*$/ 只能輸入非零的負整數
/^[a-z]+$/ 只能輸入由26個小寫英文字母組成的字符串
/^[A-Z]+$/ 只能輸入由26個大寫英文字母組成的字符串
/^[A-Za-z]+$/ 只能輸入由26個英文字母組成的字符串
/^[A-Za-z0-9]+$/ 只能輸入由數字和26個英文字母組成的字符串
/^[\u4e00-\u9fa5]{0,}$/ 只能輸入漢字
/[^\x00-\xff]/ 雙字節字符(包括漢字在內)
/^.{3}$/ 只能輸入長度爲3的字符
/[%&’,;=?$\\^]+/ 是否含有^%&’,;=?$\"等字符
/^\s*|\s*$/ 首尾空白字符
/\n\s*\r/ 空白行
/<(\S*?)[^>]*>.*?</>|<.*? />/ HTML標記。能匹配部分,複雜的嵌套不行
/^[a-zA-Z]\w{5,15}$/ 驗證用戶名和密碼.格式:"[A-Z][a-z]_[0-9]"組成,並且第一個字必須爲字母6~16位
/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/ 驗證帳號是否合法
(字母開頭,允許5-16字節,允許字母數字下劃線)
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ 驗證Email地址
/\d{14}[[0-9],0-9xX]/ 驗證15位身份證號
/\d{17}(\d|X|x)/ 驗證18位身份證號
/^(\d{3,4}-)\d{7,8}$/ 驗證電話號碼.格式:xxx/xxxx-xxxxxxx/xxxxxxxx
/^1([38][0-9]|4[5-9]|5[0-3,5-9]|66|7[0-8]|9[89])[0-9]{8}$/ 驗證手機號碼(包含虛擬號碼和新號碼段)
/[1-9][0-9]{4,}/ 騰訊QQ號
/^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/ 驗證URL
/[a-zA-z]+://[^\s]*/ 網址URL
/([1-9]{1,3}\.){3}[1-9]/ ip地址
/([A-Fa-f0-9]{2}😃{5}[A-Fa-f0-9]/ MAC地址
/[1-9]\\d{5}(?!\d)/ 中國郵政編碼
/"^(0?[1-9]|1[0-2])$"/ 一年的12個月。“01"~"09"和"10"~"12”
/"^((0?[1-9])|((1|2)[0-9])|30|31)$"/ 一個月的31天.正確格式爲:“01"~"09”、“10"~"29"和"30”~“31”
/\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?/ 大多數年月日信息

1111

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