1. 程式人生 > >正則表示式(RegEx)——快速參考

正則表示式(RegEx)——快速參考

https://ahkcn.github.io/docs/misc/RegEx-QuickRef.htm#%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%88RegEx%EF%BC%89%E2%80%94%E2%80%94%E5%BF%AB%E9%80%9F%E5%8F%82%E8%80%83

正則表示式(RegEx)——快速參考
基礎知識
在任意位置進行匹配: 預設情況下, 正則表示式可以匹配被搜尋字串的 任意位置 的子字串. 例如, 正則表示式 abc 可以匹配 abc123, 123abc 以及 123abcxyz. 要限制在開始或末尾進行匹配, 請使用 錨.

轉義字元: 大多數字符 (例如 abc123) 可以直接使用在正則表示式中. 然而, .*?+[{|()^$ 這些字元則必須在其前面加上反斜線來進行匹配. 例如, . 表示一個原義的句點而 \ 表示一個原義的反斜線. 使用 \Q…\E 能避免轉義. 例如: \QLiteral Text\E.

區分大小寫: 預設情況下, 正則表示式是區分大小寫的. 這種特性可以使用 “i” 選項進行改變. 例如, 模式 i)abc 會搜尋所有大小寫形式的 “abc”. 請參閱下面瞭解其他的選項.

選項 (區分大小寫)
在正則表示式的最前面, 指定零個或多個下列選項後面跟著閉括號. 例如, 模式 “im)abc” 將帶有不區分大小寫和多行選項來搜尋 abc (如果不含選項, 則這個圓括號可以省略). 儘管這種語法有別於傳統, 不過它不需要特殊的分隔符 (例如正斜槓), 因此不需要對模式中的這樣的分隔符進行轉義. 此外, 由於很容易解析出選項, 所以提升了效能.

i 不區分大小寫匹配, 它把字母 A 到 Z 視為等同於它們的小寫副本.
m
多行. 把Haystack視為許多單獨的行(如果它包含新行符)的集合而不是一個單個的連續行。具體地, 它會改變下列方式:

1) 抑揚符 (^) 能匹配緊跟在內部所有新行符之後的位置, 如同它總能匹配 Haystack 的開始處一樣 (但它不會匹配 Haystack 的 最後面 的新行符之後的位置).

2) 美元符 ($) 能匹配 Haystack 中任何新行符之前的位置 (如同它總能匹配最後面的位置).

例如,模式“m)^abc$”中包含了“m”選項才能在 Haystack“xyzrnabc”中形成匹配。

使用了 “m” 選項時 “D” 選項會被忽略.

s DotAll. 此選項會讓句點 (.) 匹配包含新行符在內的所有字元 (一般情況下, 它不能匹配新行符). 然而, 如果換行符是預設的 CRLF (rn), 則必須使用兩個句點才能進行匹配 (不是一個). 不論是否使用此選項, 排除型字元類 (例如 [^a]) 總能匹配新行符.
x 忽略模式中的空白字元, 除非對它們進行轉義或出現在字元類中. 字元 n 和t 在它們達到 PCRE 時會被忽略, 因為它們已經是原始的/原義的空白字元 (與之相比, \n 和 \t 則不會被忽略, 因為它們是 PCRE 的轉義序列). x 選項還會忽略字元類外面的非轉義 # 和下一個新行符之間的字元 (包括它們). 這使得在複雜的模式中添加註釋成為可能. 然而, 這隻適用於資料字元; 空白字元可能永遠都不會出現在特殊字元序列中, 例如 (?(, 它以條件子模式開頭.
A 強制固定匹配模式; 即它只能匹配 Haystack 的開始處 (即使開始處是換行符, 也會從換行符開始匹配而不從換行符之後的字元開始). 在大多數條件下, 它的作用等同於在模式中使用 “^”.
D 強制美元符 ( ) H a y s t a c k , 使 H a y s t a c k . 會匹配最後的新行符之前的位置(如果有新行符,此時匹配不會包括新行符)。注: 使用了 “m” 選項時此選項會被忽略.
J 允許重複 命名子模式. 它可用於在一組相同的命名子模式中只有其中一個形成匹配的模式. 注: 如果有多個特殊名子模式的例項形成匹配, 那麼只儲存最左邊的那個. 此外, 變數名不區分大小寫.
U 非貪婪. 讓限定符 *+?{} 在形成匹配時只消耗必需的那些字元, 把剩下的部分留給模式的後面部分. 沒有使用 “U” 選項時, 可以在這些字元後加上問號來限定它們為非貪婪的. 相反地, 使用了 “U” 選項時, 問號會成為貪婪匹配的限定符.
X PCRE_EXTRA. 啟用不相容 Perl 的 PCRE 功能. 目前, 這樣的唯一功能是在模式中的任意反斜線後跟著沒有特殊含義的字母時會導致匹配失敗並因此設定 ErrorLevel. 此選項會幫助保留未使用的反斜線序列供將來使用. 如果沒有此選項, 反斜線後跟著沒有特殊含義的字母時會被視為原義的 (即 \g 和 g 都被識別為原義的 g). 不論是否使用此選項, 沒有特殊含義的非字母反斜線序列總是被視為原義的 (即 \/ 和 / 都被視為正斜槓).
P 位置模式. 這會使 RegExMatch() 產生匹配和其子模式的位置和長度而不是匹配它們的子字串. 更多細節請參閱 UnquotedOutputVar。
S 研究模式來提高效能. 它可用於要執行多次的特殊模式 (尤其是複雜的模式). 如果 PCRE 找到了提高效能的方法, 則會把這個發現儲存到快取中模式的旁邊, 以便在之後執行相同模式時使用 (後續使用此模式時還需要指定 S 選項, 因為要找到快取中相同的模式則它們的選項也必須完全相同, 包括它們的順序). (這裡的研究主要指在進行匹配前使用其他一些通常較簡單快速的方法進行判斷, 例如假設模式至少匹配 5 個字元, 而源字串只有 3 個, 那麼正則表示式引擎會直接返回 “沒有匹配” 的結果, 而不會進行匹配.)
C 啟用自動調出模式。請參閱正則表示式調出瞭解更多資訊。
n 從預設的新行符 (rn) 切換到單獨的換行符 (n), 這是 UNIX 系統的標準. 所選擇的新行符會影響 錨 (^ 和 $) 和 含句點的模式.
r 從預設的新行符 (rn) 切換到單獨的回車符 (r).
a 在 v1.0.46.06+,a 可以識別任意型別的新行符, 即 r,n, rn, v/VT/vertical tab/chr(0xB),f/FF/formfeed/chr(0xC) 以及 NEL/next-line/chr(0x85). 在 v1.0.47.05+,新行符可以被限制為 CR、LF 和 CRLF 三種,只需要在模式的開始處(選項後面)指定大寫的(*ANYCRLF);例如 im)(*ANYCRLF)^abc$。
注: 在兩個選項間可以使用空格或 tab 分隔.

常用符號和用法
. 預設情況下, 句點匹配除新行符 (rn) 序列外的任何單個字元, 但是這種特性可以使用 DotAll (s), 新行 (n), 回車 (r), `a 或 (*ANYCRLF) 選項進行改變. 例如, ab. 可以匹配 abc 和 abz 以及 ab_.
*
星號匹配零個或多個前面的字元, 字元類 或 子模式. 例如, a* 可以匹配 ab 和 aaab. 它還可以匹配完全不包含 “a” 的任意字串的開始處.

萬用字元: 句點星號模式 .* 是匹配範圍最廣的模式之一, 因為它可以匹配零個或多個 任意 字元 (除了新行符: r 和n). 例如, abc.*123 可以匹配 abcAnything123, 也能匹配 abc123.

? 問號匹配零或一個前面的字元, 字元類 或 子模式. 可以理解為 “前面的那項是可選的”. 例如, colou?r 可以匹配 color 和 colour, 因為 “u” 是可選的.
+ 加號匹配一個或多個前面的字元, 字元類 或 子模式. 例如 a+ 可以匹配 ab 和 aaab. 但與 a* 和 a? 不同的是, 模式 a+ 不會匹配開始處沒有 “a” 的字串.
{min,max}
匹配出現次數介於 min 和 max 的前面的字元, 字元類 或 子模式. 例如, a{1,2} 可以匹配 ab 但只匹配 aaab 中的前兩個 a.

此外, {3} 表示準確匹配 3 次, 而 {3,} 則表示匹配 3 次或更多. 注: 指定的數字必須小於 65536, 且第一個必須小於等於第二個.

[…]
字元類: 方括號把一列字元或一個範圍括在了一起 (或兩者). 例如, [abc] 表示 “a, b 或 c 的中任何一個字元”. 使用破折號來建立範圍; 例如, [a-z] 表示 “在小寫字母 a 和 z (包含的) 之間的任何一個字元”. 列表和範圍可以組合在一起; 例如 [a-zA-Z0-9_] 表示 “字母, 數字或下劃線中的任何一個字元”.

字元類後面可以使用 *, ?, + 或 {min,max} 進行限定. 例如, [0-9]+ 匹配一個或多個任意數字; 因此它可以匹配 xyz123 但不會匹配 abcxyz.

通過 [[:xxx:]] 還支援下列 POSIX 命名集, 其中 xxx 是下列單詞的其中一個: alnum, alpha, ascii (0-127), blank (space 或 tab), cntrl (控制字元), digit (0-9), xdigit (十六進位制數), print, graph (排除了空格的列印字元), punct, lower, upper, space (空白), word (等同於 \w).

在字元類中, 只有在類中具有特殊含義的字元才需要進行轉義; 例如 [\^a], [a-b], [a]] 和 [\a].

[^…] 匹配 不 在類中的任何一個字元. 例如, [^/]* 匹配零個或多個 不是 正斜槓的任意字元, 例如 http://. 同樣地, [^0-9xyz] 匹配既不是數字也不是 x, y 或 z 的任何一個字元.
\d 匹配任意一個數字 (相當於類 [0-9]). 相反地,大寫的\D表示“任意的非數字字元”。這個和下面的兩個都可以用在 字元類 中; 例如, [\d.-] 表示 “任何數字, 句點或負號”.
\s 匹配任意單個空白字元 , 主要是空格, tab 和新行符 (r 和n). 相反地, 大寫的 \S 表示 “任何 非空白字元”.
\w 匹配任何單個 “單詞” 字元, 即字母, 數字或下劃線. 這等同於 [a-zA-Z0-9_]. 相反地, 大寫的 \W 表示 “任何 非單詞字元”.
^
( ) ( ) 被稱為 錨, 因為它們不消耗任何字元; 相反地, 它們把模式限定在被搜尋字串的開始或末尾進行匹配.

在模式的開始處使用 ^ 表示需要在行的開始處進行匹配. 例如, ^abc 可以匹配 abc123 但不匹配 123abc.

在模式的末尾處使用 . , a b c 可以匹配 123abc 但不能匹配 abc123.

這兩個錨還可以組合使用. 例如, ^abc$ 僅匹配 abc (即在它的前面或後面不能有另外的字元).

如果被搜尋的文字包含多行, 則可以使用 “m” 選項 讓錨應用於每行而不是把所有文字作為整體. 例如, m)^abc$ 可以匹配 123rnabcrn789. 但如果沒有 “m” 選項, 則不會形成匹配.

\b \b 表示 “單詞邊界”, 它類似錨, 因為它不消耗任何字元. 它要求當前字元的 狀態為單詞字元 (\w), 與前一個字元的狀態相反. 它通常用來避免意外地匹配到在其他單詞內的某個單詞. 例如, \bcat\b 不會匹配 catfish, 但它可以匹配不論周圍是否有標點或空白的 cat. 大寫的 \B 則相反: 它要求當前字元 不是 單詞的邊界.
| 豎線將兩個或多個可選專案分隔開來. 如果可選專案中 任何一個 滿足條件, 則會形成匹配. 例如, gray|grey 既可以匹配 gray 也可以匹配 grey. 同樣地, 模式 gr(a|e)y 中通過下面描述的括號的幫助可以實現同樣的作用.
(…)
括在括號中的專案常用於:

確定求值的順序. 例如, (Sun|Mon|Tues|Wednes|Thurs|Fri|Satur)day 可以匹配任何一天的名稱.
把 *, ?, + 或 {min,max} 應用到 系列 字元而不只是單個字元. 例如, (abc)+ 匹配一個或一串字串 “abc”; 因此它可以匹配 abcabc123 但不會匹配 ab123 或 bc123.
捕獲子模式, 例如 abc(.)xyz 中的句點星號. 例如, RegExMatch() 會把匹配每個子模式的子字串儲存到 輸出陣列. 同樣地, RegExReplace() 中允許把匹配每個子模式的子字串通過像 $1 這樣的 後向引用 重新插入到替換結果中. 要使用不捕獲子模式的括號, 請把括號內的開始兩個字元指定為 ?:; 例如: (?:.)
在匹配過程中改變 選項. 例如, (?im) 會為模式的後續部分開啟不區分大小寫和多行選項 (如果它在子模式中則它會改變子模式的選項). 相反地, (?-im) 會關閉它們. 支援除 DPSrna 外的所有選項.
\t
\r
等等.
這些轉義序列表示特殊的字元. 最常見的有 \t (tab), \r (回車) 和 \n (換行). 在 AutoHotkey, 在這些情況中還可以使用重音符 (
) 代替反斜線. 還支援 \xhh 格式的轉義序列, 其中 hh 是介於 00 和 FF 之間的任意 ANSI 字元的十六進位制碼.

在 v1.0.46.06+, \R 表示 “單個任意型別的新行符”, 即在 `a 選項 中列出的這些 (然而, \R 在 字元類 中僅僅表示字母 “R”). 在 v1.0.47.05+, \R 可以被限制為 CR, LF 和 CRLF 三種, 只需要在模式的開始處 (選項後面) 指定大寫的 (*BSR_ANYCRLF) ; 例如 im)(*BSR_ANYCRLF)abc\Rxyz

\p{xx}
\P{xx}
\X
[AHK_L 61+]: Unicode 字元屬性. 在 ANSI 版本中不支援. \p{xx} 匹配帶 xx 屬性的字元而 \P{xx} 匹配 不帶 xx 屬性的任意一個字元. 例如, \pL 匹配任意一個字母而 \p{Lu} 匹配任意一個大寫字母. \X 匹配組成擴充套件 Unicode 序列的任何數目的字元.

對於受支援的屬性名稱的完整列表和其他細節, 請在 www.pcre.org/pcre.txt 中搜索 “\p{xx}”.

(*UCP)
[AHK_L 61+]: 考慮到效能, \d, \D, \s, \S, \w, \W, \b 和 \B 預設情況下只識別 ASCII 字元, 即使在 Unicode 版本中也是如此. 如果模式以 (*UCP) 開頭, 則會使用 Unicode 屬性來判斷哪個字元匹配. 例如, \w 變成相當於 [\p{L}\p{N}_] 而 \d 變成等同於 \p{Nd}.

貪婪:預設情況下,*、?、+ 和 {min,max} 是貪婪的,因為它們消耗到最後一個能滿足整個模式的可能的所有字元。要讓它們停在 首個 可能的字元, 請在它們後面加上問號. 例如, 模式 <.+> (其中沒有問號) 表示: “搜尋一個 <, 接著一個或多個任意字元, 然後是一個 >”. 要在匹配 整個 字串 text 時停止, 請在加號後加上問號: <.+?>. 這樣會讓匹配在第一個 ‘>’ 處停止, 因此它只匹配第一個標籤 .

預測和回顧斷言:這組 (?=…)、(?!…)、(?<=…) 和 (?