正則表示式語法速查表

本頁透過聚合 RegExp 指南中的文章內容,提供了 RegExp 語法所有功能的速查表。如果您需要有關特定主題的更多資訊,請點選相應標題上的連結以訪問完整文章,或前往指南

字元類

字元類用於區分不同型別的字元,例如區分字母和數字。

字元 含義
[xyz]
[a-c]

字元類: 匹配方括號中包含的任何一個字元。您可以使用連字元指定字元範圍,但如果連字元出現在方括號內作為第一個或最後一個字元,則它將被視為一個字面連字元,並作為普通字元包含在字元類中。

例如,[abcd][a-d] 相同。它們匹配 "brisket" 中的 "b" 和 "chop" 中的 "c"。

例如,[abcd-][-abcd] 匹配 "brisket" 中的 "b"、"chop" 中的 "c" 以及 "non-profit" 中的 "-" (連字元)。

例如,[\w-][A-Za-z0-9_-] 相同。它們都匹配 "brisket" 中的 "b"、"chop" 中的 "c" 以及 "non-profit" 中的 "n"。

[^xyz]
[^a-c]

反向字元類: 匹配方括號中未包含的任何字元。您可以使用連字元指定字元範圍,但如果連字元出現在 ^ 之後的第一個字元或方括號內最後一個字元,則它將被視為一個字面連字元,並作為普通字元包含在字元類中。例如,[^abc][^a-c] 相同。它們最初匹配 "bacon" 中的 "o" 和 "chop" 中的 "h"。

注意: ^ 字元也可以表示輸入的開頭

.

萬用字元: 匹配任何單個字元,除了行終止符:\n\r\u2028\u2029。例如,/.y/ 匹配 "yes make my day" 中的 "my" 和 "ay",但不匹配 "yes" 中的 "yes",因為 "yes" 中 "y" 前面沒有字元。如果啟用了 dotAll (s) 標誌,則也匹配行終止符。在字元類內部,點號失去其特殊含義,匹配一個字面點號。

\d

數字字元類轉義: 匹配任何數字(阿拉伯數字)。等同於 [0-9]。例如,/\d//[0-9]/ 匹配 "B2 is the suite number" 中的 "2"。

\D

非數字字元類轉義: 匹配任何非數字(阿拉伯數字)字元。等同於 [^0-9]。例如,/\D//[^0-9]/ 匹配 "B2 is the suite number" 中的 "B"。

\w

單詞字元類轉義: 匹配基本拉丁字母中的任何字母數字字元,包括下劃線。等同於 [A-Za-z0-9_]。例如,/\w/ 匹配 "apple" 中的 "a"、"$5.28" 中的 "5"、"3D" 中的 "3" 和 "Émanuel" 中的 "m"。

\W

非單詞字元類轉義: 匹配基本拉丁字母中非單詞字元的任何字元。等同於 [^A-Za-z0-9_]。例如,/\W//[^A-Za-z0-9_]/ 匹配 "50%" 中的 "%" 和 "Émanuel" 中的 "É"。

\s

空白字元類轉義: 匹配單個空白字元,包括空格、製表符、換頁符、換行符和其他 Unicode 空格。等同於 [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\s\w*/ 匹配 "foo bar" 中的 " bar"。

\S

非空白字元類轉義: 匹配單個非空白字元。等同於 [^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\S\w*/ 匹配 "foo bar" 中的 "foo"。

\t 匹配水平製表符。
\r 匹配回車符。
\n 匹配換行符。
\v 匹配垂直製表符。
\f 匹配換頁符。
[\b] 匹配退格符。如果您要查詢單詞邊界斷言 (\b),請參閱斷言
\0 匹配 NUL 字元。其後不能跟其他數字。
\cX

使用脫字號表示法匹配控制字元,其中 "X" 是 A-Z 的字母(對應於程式碼點 U+0001U+001A)。例如,/\cM\cJ/ 匹配 "\r\n"。

\xhh 匹配程式碼為 hh(兩個十六進位制數字)的字元。
\uhhhh 匹配值為 hhhh(四個十六進位制數字)的 UTF-16 程式碼單元。
\u{hhhh}\u{hhhhh} (僅當設定了 u 標誌時)匹配 Unicode 值為 U+hhhhU+hhhhh(十六進位制數字)的字元。
\p{UnicodeProperty}, \P{UnicodeProperty}

Unicode 字元類轉義: 根據其 Unicode 字元屬性匹配字元(例如,表情符號字元、日文片假名字元或中文/日文漢字等)。

\

表示應特殊對待或“轉義”後續字元。它有兩種行為方式。

  • 對於通常被視為字面字元的字元,表示下一個字元是特殊的,不應按字面解釋。例如,/b/ 匹配字元 "b"。透過在 "b" 前面放置反斜槓,即使用 /\b/,該字元變得特殊,表示匹配單詞邊界。
  • 對於通常被特殊對待的字元,表示下一個字元不是特殊的,應按字面解釋。例如,"*" 是一個特殊字元,表示匹配前一個字元出現 0 次或更多次;例如,/a*/ 表示匹配 0 個或更多個 "a"。要字面匹配 *,請在其前面加上反斜槓;例如,/a\*/ 匹配 "a*"。

注意: 要字面匹配此字元,請用自身轉義它。換句話說,要搜尋 \,請使用 /\\/

x|y

邏輯或: 匹配 "x" 或 "y"。每個由豎線 (|) 分隔的組成部分稱為一個替代項。例如,/green|red/ 匹配 "green apple" 中的 "green" 和 "red apple" 中的 "red"。

注意: 邏輯或是一種指定“一組選擇”的另一種方式,但它不是一個字元類。邏輯或不是原子——您需要使用一個分組來使其成為更大模式的一部分。[abc] 在功能上等同於 (?:a|b|c)

斷言

斷言包括邊界(指示行和單詞的開頭和結尾)以及以某種方式指示匹配可能性的其他模式(包括先行斷言、後行斷言和條件表示式)。

邊界型別斷言

字元 含義
^

輸入邊界起始斷言: 匹配輸入的開頭。如果啟用了 multiline (m) 標誌,則也匹配換行符之後的位置。例如,/^A/ 不匹配 "an A" 中的 "A",但匹配 "An A" 中的第一個 "A"。

注意: 當此字元出現在字元類的開頭時,它具有不同的含義。

$

輸入邊界結束斷言: 匹配輸入的結尾。如果啟用了 multiline (m) 標誌,則也匹配換行符之前的位置。例如,/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"。

\b

單詞邊界斷言: 匹配一個單詞邊界。這是單詞字元不緊接或不緊跟另一個單詞字元的位置,例如在字母和空格之間。請注意,匹配的單詞邊界不包含在匹配結果中。換句話說,匹配的單詞邊界的長度為零。

示例

  • /\bm/ 匹配 "moon" 中的 "m"。
  • /oo\b/ 不匹配 "moon" 中的 "oo",因為 "oo" 後面跟著 "n",而 "n" 是一個單詞字元。
  • /oon\b/ 匹配 "moon" 中的 "oon",因為 "oon" 是字串的結尾,因此後面沒有單詞字元。
  • /\w\b\w/ 永遠不會匹配任何內容,因為一個單詞字元永遠不會同時緊跟一個非單詞字元和一個單詞字元。

要匹配退格符 ([\b]),請參閱字元類

\B

非單詞邊界斷言: 匹配非單詞邊界。這是前一個字元和後一個字元型別相同的位置:兩者都必須是單詞字元,或者兩者都必須是非單詞字元,例如在兩個字母之間或兩個空格之間。字串的開頭和結尾被視為非單詞。與匹配的單詞邊界一樣,匹配的非單詞邊界也不包含在匹配結果中。例如,/\Bon/ 匹配 "at noon" 中的 "on",而 /ye\B/ 匹配 "possibly yesterday" 中的 "ye"。

其他斷言

注意: ? 字元也可以用作量詞。

字元 含義
x(?=y)

先行斷言: 僅當 "x" 後面跟著 "y" 時才匹配 "x"。例如,/Jack(?=Sprat)/ 僅當 "Jack" 後面跟著 "Sprat" 時才匹配 "Jack"。
/Jack(?=Sprat|Frost)/ 僅當 "Jack" 後面跟著 "Sprat" 或 "Frost" 時才匹配 "Jack"。但是,"Sprat" 和 "Frost" 都不屬於匹配結果。

x(?!y)

負向先行斷言: 僅當 "x" 後面沒有跟著 "y" 時才匹配 "x"。例如,/\d+(?!\.)/ 僅當數字後面沒有小數點時才匹配數字。/\d+(?!\.)/.exec('3.141') 匹配 "141" 而不是 "3"。

(?<=y)x

後行斷言: 僅當 "x" 前面是 "y" 時才匹配 "x"。例如,/(?<=Jack)Sprat/ 僅當 "Sprat" 前面是 "Jack" 時才匹配 "Sprat"。/(?<=Jack|Tom)Sprat/ 僅當 "Sprat" 前面是 "Jack" 或 "Tom" 時才匹配 "Sprat"。但是,"Jack" 和 "Tom" 都不屬於匹配結果。

(?<!y)x

負向後行斷言: 僅當 "x" 前面不是 "y" 時才匹配 "x"。例如,/(?<!-)\d+/ 僅當數字前面沒有減號時才匹配數字。/(?<!-)\d+/.exec('3') 匹配 "3"。/(?<!-)\d+/.exec('-3') 未找到匹配項,因為數字前面有減號。

分組和反向引用

分組和反向引用表示表示式字元組。

字元 含義
(x)

捕獲組: 匹配 x 並記住匹配項。例如,/(foo)/ 匹配並記住 "foo bar" 中的 "foo"。

一個正則表示式可以有多個捕獲組。在結果中,捕獲組的匹配項通常在一個數組中,其成員的順序與捕獲組中左括號的順序相同。這通常就是捕獲組本身的順序。當捕獲組巢狀時,這一點變得很重要。透過結果元素的索引 ([1], …, [n]) 或預定義 RegExp 物件的屬性 ($1, …, $9) 來訪問匹配項。

捕獲組會帶來效能損失。如果您不需要回調匹配的子字串,請優先使用非捕獲括號(見下文)。

如果設定了 /.../g 標誌,String.prototype.match() 將不返回分組。但是,您仍然可以使用 String.prototype.matchAll() 來獲取所有匹配項。

(?<Name>x)

命名捕獲組: 匹配 "x" 並將其儲存在返回匹配項的 groups 屬性中,名稱由 <Name> 指定。組名需要尖括號(<>)。

例如,要從電話號碼中提取美國區號,我們可以使用 /\((?<area>\d\d\d)\)/。結果數字將出現在 matches.groups.area 下。

(?:x)

非捕獲組: 匹配 "x" 但不記住匹配項。匹配的子字串無法從結果陣列的元素 ([1], …, [n]) 或預定義 RegExp 物件的屬性 ($1, …, $9) 中回撥。

(?flags:x), (?:flags-flags:x)

修飾符: 僅對封閉模式啟用或停用指定標誌。修飾符中只能使用 ims 標誌。

\n

反向引用: 其中 "n" 是一個正整數。匹配正則表示式中第 n 個捕獲組(從左括號開始計數)匹配的相同子字串。例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach" 中的 "apple, orange,"。

\k<Name>

命名反向引用: 對由 <Name> 指定的命名捕獲組最後匹配的子字串的反向引用。

例如,/(?<title>\w+), yes \k<title>/ 匹配 "Do you copy? Sir, yes Sir!" 中的 "Sir, yes Sir"。

注意: \k 在此字面表示命名捕獲組的反向引用的開頭。

量詞

量詞表示要匹配的字元或表示式的數量。

注意: 在下文中,不僅指單個字元,還包括字元類以及分組和反向引用

字元 含義
x*

匹配前面的項 "x" 0 次或更多次。例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo" 和 "A bird warbled" 中的 "b",但在 "A goat grunted" 中不匹配任何內容。

x+

匹配前面的項 "x" 1 次或更多次。等同於 {1,}。例如,/a+/ 匹配 "candy" 中的 "a" 和 "caaaaaaandy" 中的所有 "a"。

x?

匹配前面的項 "x" 0 次或 1 次。例如,/e?le?/ 匹配 "angel" 中的 "el" 和 "angle" 中的 "le"。

如果緊跟在 *+?{} 任何一個量詞之後使用,則使量詞非貪婪(匹配最少次數),與預設的貪婪(匹配最多次數)相反。

x{n}

其中 "n" 是一個非負整數,精確匹配前面的項 "x" 出現 "n" 次。例如,/a{2}/ 不匹配 "candy" 中的 "a",但匹配 "caandy" 中的所有 "a",以及 "caaandy" 中的前兩個 "a"。

x{n,}

其中 "n" 是一個非負整數,匹配前面的項 "x" 至少出現 "n" 次。例如,/a{2,}/ 不匹配 "candy" 中的 "a",但匹配 "caandy" 和 "caaaaaaandy" 中的所有 "a"。

x{n,m}

其中 "n" 和 "m" 是非負整數,且 m >= n,匹配前面的項 "x" 至少出現 "n" 次,最多出現 "m" 次。例如,/a{1,3}/ 在 "cndy" 中不匹配任何內容,匹配 "candy" 中的 "a","caandy" 中的兩個 "a",以及 "caaaaaaandy" 中的前三個 "a"。請注意,當匹配 "caaaaaaandy" 時,匹配結果是 "aaa",儘管原始字串中包含更多的 "a"。

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

預設情況下,像 *+ 這樣的量詞是“貪婪的”,這意味著它們會嘗試匹配儘可能多的字串。量詞後面的 ? 字元使量詞“非貪婪”:這意味著它會在找到匹配項後立即停止。例如,給定一個像 "some <foo> <bar> new </bar> </foo> thing" 的字串

  • /<.*>/ 將匹配 "<foo> <bar> new </bar> </foo>"
  • /<.*?>/ 將匹配 "<foo>"