Regular Mode & Behavior
名稱 |
英文 |
字符/格式 |
描述 |
簡
單
模
式 |
元字符 |
Meta Character |
{ } [ ] ( ) \ / ^ $ * + . , ? | : = ! - |
元字符是正則表達式語法的一部分。任何時候要在正則表達式中使用這些元字符,都必須對它們進行轉義,即其前加上反斜線。另外,在某些編程語言中,反斜線“\”通常用來進行轉義操作,那么此時使用元字符時,就要進行雙重轉義,即先轉義反斜線再轉義元字符。 |
特殊字符 |
Special Character |
\t \n \r \f \a \e \cX \B \V \0 |
通常是一些不可見的格式控制符號,使用時也應該注意雙重轉義。 |
字
符
類 |
簡單類 |
Simple Class |
[...] |
指定要包含的字符。 |
負向類 |
Negation Class |
[^...] |
指定要排除的字符。 |
范圍類 |
Range Class |
[...-...] |
指定要包含的字符有序序列。 |
負向范圍類 |
Negative Range Class |
[^...-...] |
指定要排除的字符有序序列。 |
組合類 |
Combination Class |
由幾種字符類組合而成的字符類(內部類之間不能有空格)。組合類中允許出現簡單類、負向類、范圍類、預定義類。 |
聯合類 |
Union Class |
|
交叉類 |
Intersection Class |
|
預定義類 |
Predefined Class |
. \d \D \s \S \w \W \xXX \XXX \uXXXX |
某些反復用到的模式被預先定義,可以方便地指定復雜的模式,也使模式的匹配變得更簡單。 |
量
詞 |
量詞 |
Quantifier |
用于指定某個特定模式出現的次數。當指定某個模式應當出現的次數時,可以指定硬性數量或指定軟性數量。量詞使用在某個模式的后面,用以限定該模式在字符串中出現的次數。 |
貪婪(簡單)量詞 |
Greedy Quantifier |
? * + {n} {n,m} {n,} |
先看整個的字符串是不是一個匹配。如果沒有發現匹配,它去掉最后字符串中的最后一個字符,并再次嘗試。如果還是沒有發現匹配,那么再次去掉最后一字符,這個過程會一直重復直到發現一個匹配或者或者字符串不剩任何字符。 |
惰性量詞 |
Inert Quantifier |
?? *? +? {n}? {n,m}? {n,}? |
先看字符串中第一個字符是不是一個匹配。如果單獨這一個字符還不夠,就讀入下一個字符,組成兩個字符的字符串。如果還是沒有發現匹配,惰性量詞繼續從字符串中添加字符直到發現一個匹配或者整個字符串都檢查過也沒有匹配。當發現一個匹配后,忽略前面已經匹配的字符串,接著從字符串的下一個字符開始進行新的匹配檢查。惰性量詞和貪婪量詞的工作方式恰好相反。 |
支配性量詞 |
Dominant Quantifier |
?+ *+ ++ {n}+ {n,m}+ {n,}+ |
嘗試匹配整個字符串。如果整個字符串不能產生匹配,不做進一步嘗試。 |
復
雜
模
式 |
分
組 |
(捕獲性)分組 |
Capture Group |
(...) |
通過一系列圓括號包圍一系列字符、字符類以及量詞來使用。它可以處理特定的字符或字符序列的重復問題。通過混合使用字符、字符類和量詞,可以實現一些相當復雜的分組,同時也不介意將分組放在分組間。 |
反向引用 |
Back-Reference |
每個捕獲性分組在使用后都被存放在一個特殊的地方以備將來使用,這些存儲在分組中的特殊值,叫做“反向引用”。反向引用是按照從左到右遇到的左圓括號字符的順序進行創建和編號的。在正則表達式中,反向引用可以從構造函數、轉義 \n、$n 等形式中獲取。 |
非捕獲性分組 |
No-Capture Group |
(?:...) |
只有捕獲性分組才能創建反向引用,非捕獲性分組無法創建。在較長的正則表達式中,存儲反向引用會降低匹配速度。通過使用非捕獲性分組,仍然可以擁有與匹配字符串序列同樣的能力,而無需存儲結果的開銷。非捕獲性分組不能使用任何形式的反向引用。 |
候選 |
Candidate |
...|... |
候選項可以是任意多個,在兩兩模式之間加上豎線,用于匹配可能的模式。 |
前
瞻 |
前瞻 |
Look-Ahead |
它告訴正則表達式運算器向前看一些字符而不移動其位置。前瞻會使用到圓括號,但這不是分組,分組是不會考慮前瞻的存在(無論是正向還是負向)。若在分組中使用前瞻,無論是正向還是負向,都可以使用分組的反向引用,但該反向引用中并不包含前瞻模式串。 |
正向前瞻 |
Forward Look-Ahead |
(?=...) |
檢查的是接下來出現的是不是某個允許的特定字符集。 |
負向前瞻 |
Negation Look-Ahead |
(?!...) |
檢查的是接下來出現的是不是不應該出現的特定字符集。 |
后瞻 |
Look-Behind |
匹配 b 當且僅當它前面沒有 a。 |
邊界 |
Boundary |
^ $ \b \B |
用于正則表達式中以表示模式的位置。 |
多行模式 |
Multiline |
m?。ㄔO置多行模式為 True) |
只要在正則表達式中設置多行模式為 True 即可。它會讓 $ 邊界匹配換行符 \n 以及字符串真正的結尾。多行模式會讓 ^ 邊界匹配換行符之后的位置。 |
Classic Regular Application
|
名稱 |
變量 |
正則表達式 |
基
礎
模
式 |
英文字母 |
Character |
^[A-Za-z]+$ |
英文大寫字母 |
Lower-Char |
^[A-Z]+$ |
英文小寫字母 |
Upper-Char |
^[a-z]+$ |
字母和數字 |
Char-Int |
^[A-Za-z0-9]+$ |
整數 |
Integer |
^-?\d+$ |
正整數 |
SL-Int |
^[0-9]*[1-9][0-9]*$ |
非正整數 |
NOT-SL-Int |
^((-\d+)|(0+))$ |
負整數 |
NT-Int |
^-[0-9]*[1-9][0-9]*$ |
非負整數 |
NOT-NT-Int |
^\d+$ |
浮點數 |
Float-Num |
^(-?\d+)(\.\d+)?$ |
正浮點數 |
SL-Float |
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ |
非正浮點數 |
NOT-SL-Float |
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ |
負浮點數 |
NT-Float |
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ |
非負浮點數 |
NOT-NT-Float |
^\d+(\.\d+)?$ |
雙字節字符(包括中文) |
D-Byte-Char |
[^\x00-\xff] |
空行 |
Blank-Line |
\n\s*\r |
實
際
應
用 |
電子郵件 |
E-mail |
^([a-z0-9])(([\-.]|[_]+)?([a-z0-9]+))*(@)([a-z0-9])((([-]+)?([a-z0-9]+))?)*((.[a-z]{2,3})?(.[a-z]{2,6}))$ |
網址 |
URL |
^((https|http|ftp|rtsp|mms)://)(([0-9a-z_!~*’().&=+$%-]+: )?[0-9a-z_!~*’().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*’()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-z_!~*’().;?:@&=+$,%#-]+)+/?)$ |
IP 地址 |
IP |
^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$ |
身份證 |
ID-Card |
^\d{15}|\d{18}$ |
電話號碼 |
Phone |
^\d+$ |
郵政編碼 |
Zip-Code |
^[1-9]\d{5}(?!\d)$ |
金額 |
Money |
^\d+\.\d{2}$ |
帳號 |
Account |
^\w{6,15}$ |
密碼 |
Password |
^\w{6,15}$ |
中文 |
Chinese |
[\u4e00-\u9fa5] |
日期(yyyy-mm-dd) |
Date |
^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$ |
日期時間(yyyy-mm-dd hh:mm:ss) |
DateTime |
^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$ |
Conception & History
概
念 |
正則表達式 Regular Expression(regexp,regex,regxp),正規表達式,正規表示式,常規表達式,“模式”。 |
正則表達式是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。 |
歷
史 |
最初的正則表達式出現于理論計算機科學的自動控制理論和形式語言理論中。 |
在這些領域中有對計算(自動控制)的模型和對形式語言描述與分類的研究。 |
1940 年代,Warren McCulloch 與 Walter Pitts 將神經系統中的神經元描述成小而簡單的自動控制元。 |
稍后,數學家 Stephen Kleene 利用稱之為正則集合的數學符號來描述此模型。 |
Ken Thompson 將此符號系統引入編輯器 QED,然后是 Unix 上的編輯器 ed,并最終引入 grep。 |
自此,正則表達式被廣泛地使用于各種 Unix 或者類似 Unix 的工具,例如 Perl。 |
Quantifier
貪婪(簡單)量詞 |
惰性量詞 |
支配性量詞 |
描述 |
? |
?? |
?+ |
零次或一次出現 |
* |
*? |
*+ |
零次或多次出現 |
+ |
+? |
++ |
一次或多次出現 |
{n} |
{n}? |
{n}+ |
恰好 n 次出現 |
{n,m} |
{n,m}? |
{n,m}+ |
至少 n 次至多 m 次出現 |
{n,} |
{n,}? |
{n,}+ |
至少 n 次出現 |
Meta Character
字符 |
描述 |
字符 |
描述 |
{} |
花括號 |
- |
減號 |
[] |
方括號 |
. |
點號 |
() |
圓括號 |
, |
逗號 |
\ |
反斜線 |
? |
問號 |
/ |
正斜線 |
| |
豎線 |
^ |
箭頭符號 |
: |
冒號 |
$ |
美圓符號 |
= |
等號 |
* |
星號 |
! |
感嘆號 |
+ |
加號 |
|
|
Boundary
字符 |
描述 |
^ |
行開頭 |
$ |
行結尾 |
\b |
單詞的邊界 |
\B |
非單詞的邊界 |
Predefined Class
代碼 |
等同于 |
匹配 |
. |
[^\n\r] |
除了換行和回車之外的任意字符 |
\d |
[0-9] |
數字字符 |
\D |
[^0-9] |
非數字字符 |
\s |
[ \t\n\x0B\f\r] |
空白字符 |
\S |
[^ \t\n\x0B\f\r] |
非空白字符 |
\w |
[a-zA-Z_0-9] |
單詞字符(所有字母、數字和下劃線) |
\W |
[^a-zA-Z_0-9] |
非單詞字符 |
\xXX |
十六進制 ASCII 碼字符 |
\XXX |
八進制 ASCII 碼字符 |
\uXXXX |
十六進制 Unicode 碼字符 |
Special Character
字符 |
描述 |
\t |
制表符 |
\n |
換行符 |
\r |
回車符 |
\f |
換頁符 |
\a |
alert 字符 |
\e |
escape 字符 |
\cX |
與 X 相對應的控制字符 |
\b |
回退字符 |
\v |
垂直制表符 |
\0 |
空字符 |
Regular Precedence Level
字符 |
描述 |
優先級 |
\ |
轉義 |
1 |
() (?:) (?=) [] |
分組 |
2 |
* + ? {n} {n,m} {n,} |
量詞 |
3 |
^ $ \anymetacharacter |
位置和順序 |
4 |
| |
候選 |
5 |
注:從左至右求值。 |
|