JavaScript的正規表示式實作的是ECMAScript的RegExp樣式文法,這套文法與PCRE、Python、.NET與Java共用許多token,但在語法、Unicode處理方式、支援的旗標,以及部分語意上都有所不同。在其他引擎中能通過編譯的token,可能會被JavaScript拒絕,或者代表不同的意思,這也是為什麼任何要用在JavaScript程式碼中的常見正規表示式清單,都必須對照ECMAScript文法逐一檢查,而不能直接照抄PCRE或Python的參考資料。這份收錄44個項目的Regex Cheat Sheet,正是為了這種查詢需求而打造:每一列都包含確切的token、簡明的意義,以及以字面值寫成的JavaScript範例,讓必要的斜線分隔符與旗標保持可見;而「複製」按鈕只會把token本身放到剪貼簿上,不會附帶周邊的範例或說明。收錄項目涵蓋字元、字元類別、群組與參照、量詞、斷言與旗標,每個範例都使用RegExp.prototype.test與RegExp.prototype.exec等JavaScript API,而不是借用命令列引擎的語法。搜尋與分類篩選完全在目前的瀏覽器分頁中執行,因此查詢token永遠不會離開頁面,也不會把查詢內容送到任何地方。

common regex patterns
常見正規表示式樣式

在JavaScript中,「常見正規表示式樣式」代表什麼

「常見正規表示式樣式」這個說法,通常指的是兩種工作之一。第一種是在撰寫或審查樣式時,快速查詢像\d、\w、\s、\b或點號這樣的token。第二種則是檢查從Stack Overflow答案、Python教學或shell指令碼借來的片段,在實際會執行它的引擎中是否真的有效。在第二種工作上,JavaScript的處境有點尷尬,因為它的RegExp實作與PCRE——網路上「現代」正規表示式事實上的參考標準——十分接近卻並不完全相同。

具體的落差很快就會浮現。JavaScript中的\d代表ASCII數字0到9;它不像某些其他引擎那樣,是所有Unicode十進位數字的簡寫。\w主要涵蓋ASCII字母、ASCII數字與底線,當i與u旗標同時使用時,還有一項文件記載的Unicode感知大小寫摺疊細節。像\p{Letter}這樣的Unicode屬性跳脫,需要u或v旗標,而JavaScript不允許在同一個RegExp上同時使用u與v。回顧後行斷言(lookbehind)寫法是(?<=...)和(?

針對特定方言的參考資料:六大分類

一份精心整理的JavaScript RegExp參考資料,會依照各項目在樣式層級上的作用來分組。這份速查表把精選的44個token,整理成六個都有內容的分類,每一列都會顯示分類、確切的token、一行說明,以及以JavaScript字面值表示的可執行風格範例。下表整理了每個分類涵蓋的內容,讓你甚至不需要動用搜尋框,就能一眼看出該往哪裡找。

分類 包含內容 範例項目
字元 單一字元跳脫、Unicode碼位表示法,以及數字或文字的簡寫 ., \d, \w, \s, \u{1F600}
字元類別 以方括號表示的集合、否定類別、範圍,以及Unicode屬性跳脫 [abc], [^abc], [a-z], \p{Letter}, \P{Letter}
群組與參照 捕獲群組、具名捕獲群組、非捕獲群組、交替(alternation),以及反向參照 (...), (?<name>...), (?:...), x|y, \1, \k<name>
量詞 貪婪與惰性重複,包含精確與有上下限的次數 *, +, ?, {n}, {n,}, {n,m}, *?
斷言 錨點、邊界、前瞻(lookahead)與回顧後行斷言(lookbehind) ^, $, \b, (?=...), (?!...), (?<=...), (?<!...)
旗標 套用在RegExp字面值上、會改變比對行為的修飾符 g, i, m, s, u, v, y, d

分類欄並不只是裝飾用的。當搜尋「named」傳回好幾列結果時,把篩選範圍縮小到「群組與參照」,就能移除其餘結果,讓正確的token一眼可見。篩選條件會與搜尋框互相搭配,顯示的數量永遠是完整的符合筆數,而在沒有任何項目符合時,也會出現明確的空結果畫面,因此在尋找一個不太常見的「常見正規表示式樣式」時,不需要擔心有隱藏的結果上限。

三個步驟找到並複製特定的token

這個流程刻意設計得很短,才不會打斷你正在撰寫或審查樣式的當下。速查表中的每一列,都帶有相同的四項資訊:分類、確切的token、意義,以及JavaScript範例。搜尋與分類篩選完全在目前的瀏覽器分頁中執行,查詢內容、選取的分類、複製的token或其他輸入,都不會上傳到任何服務。

  1. 在搜尋欄位中輸入token或概念。輸入像\d這樣的字面符號、像u這樣的旗標字母,或像lookbehind、Unicode、lazy或named這類概念。符號搜尋會命中確切的token;概念搜尋則會命中說明文字與範例文字,不論你的問題是從哪個方向切入,查詢都能保持直覺。
  2. 選擇一個分類來縮小結果範圍。分類選單會把表格範圍縮限到上述六個群組中的一個,這在某個概念詞彙同時符合好幾列時特別有用。複製之前,請先檢視token、它的意義,以及可執行風格的JavaScript範例,確認這個token符合你的意圖。
  3. 在含有正確token的那一列點選「複製」。「複製」按鈕只會把那個確切的RegExp token放到剪貼簿上。不會附加分類標籤、範例中的斜線分隔符、旗標字母,或周邊的說明文字,因此複製結果能直接放進既有的樣式中,不會混入雜訊。

每一次點選「複製」,都會為單一token請求剪貼簿存取權限。一個工作識別碼會確保只有最新的一次複製嘗試,才能回報成功或失敗,因此延遲抵達的剪貼簿回應,不會描述成另一個已經改變的篩選畫面。變更搜尋內容或分類,會讓較舊的剪貼簿工作失效並清除其狀態;元件清除機制則能避免延遲的剪貼簿承諾,去更新一個已經卸載的頁面。如果瀏覽器拒絕剪貼簿權限,工具會回報一個可復原的錯誤,而不是宣稱token已經複製成功。

會改變樣式行為的旗標

旗標是放在字面值上,而不是樣式內部,而其中有幾個旗標會悄悄改變token的意義。一份列出這八個旗標具體效果的參考資料,會比單純的旗標索引更有用,因為出乎意料的行為,通常來自旗標的組合,而不是任何單一字母。速查表的旗標區塊列出d、g、i、m、s、u、v與y,下表則記錄了每一個旗標對比對結果的實際影響。

旗標 對比對結果的主要影響
g 啟用全域比對;會影響像迴圈中的RegExp.prototype.exec這類具狀態操作中的lastIndex。
i 進行不區分大小寫的比對;與u搭配使用時,可啟用Unicode感知的大小寫摺疊。
m 改變^與$處理行邊界的方式,讓它們比對任一行的開頭與結尾,而不是整段輸入的開頭與結尾。
s 讓點號(.)也能比對行結束字元,而在預設情況下點號不會比對這些字元。
u 啟用Unicode感知比對;使用像\u{1F600}這樣以大括號表示的Unicode碼位跳脫,或像\p{Letter}這樣的屬性跳脫時,都需要這個旗標。
v 啟用UnicodeSets行為,包含類別集合運算與字串屬性;不能與u在同一個RegExp上同時使用。
y 黏性模式;比對必須從lastIndex開始,而不能是lastIndex之後的任何位置。
d 在結果中公開比對的索引位置,讓每個比對結果都明確回報開始與結束位置。

u與v彼此不相容這一點,值得特別強調。使用\p{Letter}的樣式需要其中一個旗標,但在同一個字面值上同時使用兩者,會拋出語法錯誤。速查表明確說明了這個不相容之處,而不是暗示旗標永遠都能任意疊加使用。m旗標是另一個常見的困惑來源:許多人以為^與$的行為會和PCRE或編輯器搜尋對話框一樣,結果卻發現如果沒有m,錨點會綁定在整個字串的開頭與結尾。無論程式碼將在特定瀏覽器、內嵌執行環境,還是較舊版本的Node.js中執行,該環境實際支援的功能才是最終依據;這份速查表已對照MDN的JavaScript速查表MDN的RegExp參考文件進行交叉檢查,但引擎版本上的但書仍然適用,尤其是在v旗標的支援情形,以及較舊版本的回顧後行斷言(lookbehind)替代做法方面。

當參考資料還不夠用時——請實際測試樣式

語法參考資料能確認一個token是有效的JavaScript語法,但無法確認一個樣式是否會傳回正確的比對結果、擷取到正確的群組,或在不可信輸入上避免災難性回溯(catastrophic backtracking)。實際使用的樣式,在上線前一定要先用具代表性的輸入資料跑過一遍,而即時的Regex Tester會在你輸入樣式的同時,把每個比對結果、捕獲群組與具名群組都標示出來,比每改一次就寫一段主控台程式碼快得多。這份速查表刻意只做快速的語法參考,而不是正規表示式驗證工具、安全性分析工具、相容性資料庫,或效能保證,因此把它當成起點、再用測試工具驗證實際行為,能讓整個流程保持精簡,同時不省略測試這一步。對於將套用在不可信文字上的樣式,也應該儘量簡化貪婪量詞,並多利用惰性形式或否定字元類別,讓引擎的運算範圍保持有限,藉此避免不受控制的回溯。

如需更深入的說明,請參閱如何在JavaScript中檢查正規表示式樣式

如需更深入的說明,請參閱如何在JavaScript中產生UUID