正規表示式測試器(Regex)
輸入模式、勾選需要的旗標並貼上文字:輸入的同時,每個比對結果都會即時醒目標示,並列出其位置與擷取群組。模式直接在瀏覽器內建的 JavaScript 正規表示式引擎上執行,因此結果與你的程式碼一致,文字也始終留在你的裝置上。
0 個字元 · 0 個字詞 · 0 行
符合的內容會在此標示。0 個字元 · 0 個字詞 · 0 行
完全在此瀏覽器分頁中執行,您的文字不會被上傳或儲存。
JavaScript 正規表示式語法
「第一個符合項目」欄是以建置本頁的 JavaScript 引擎,對各模式的文字實際執行後得出的。
| 權杖 | 意義 | 模式 | 文字 | 第一個符合項目 |
|---|---|---|---|---|
\d | 數字 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | 字母、數字或底線(ASCII) | /\w+/ | snake_case-id | snake_case |
\s | 空白字元,包括 Tab 與換行 | /\s+/ | two spaces | |
. | 除換行以外的任何字元(使用 s 時除外) | /a.c/ | abc a-c | abc |
^ $ | 輸入的開頭與結尾(使用 m 時為行首與行尾) | /^\w+$/ | single | single |
[abc] | 列出的字元之一 | /[aeiou]/ | rhythm and blues | a |
[^abc] | 未列出的任何字元 | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 次以上、1 次以上、0 或 1 次 | /colou?r/ | color colour | color |
{n,m} | n 到 m 次 | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | 擷取群組 | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | 具名擷取群組 | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | 不擷取的群組 | /(?:ab)+/ | ababab! | ababab |
a|b | 任一邊 | /cat|dog/ | hotdog | dog |
\b | 字詞邊界 | /\bcat\b/ | concat cat | cat |
(?=…) | 後面接著(前瞻) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | 前面不是(否定後顧) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | 任何 Unicode 字母(需搭配 u) | /\p{L}+/u | naïve 東京 | naïve |
六個旗標及其作用
g(全域)會找出所有符合的結果,而不是找到第一個就停止;沒有它的話,結果清單只會有一筆。i 忽略大小寫。m(多行)會讓 ^ 和 $ 比對每一行的開頭與結尾,而不只是整段文字的開頭與結尾,要找行尾空白這類樣式時就需要它。s(dotAll,ES2018 新增)讓 . 也能比對換行。u(unicode)以碼位處理文字,因此一個表情符號只算一個字元,同時啟用 \p{L} 這類屬性跳脫,可比對任何文字系統中的任何字母。y(sticky)只在目前位置精準比對,是詞法分析器使用的模式。JavaScript 還有用於比對索引的 d,以及用於字元類別集合運算的 v;本測試工具只提供上述六種。
在測試文字下方,每筆符合結果都會顯示其索引與群組。編號群組來自一般括號,(?:…) 為不擷取的群組,而 (?<year>\d{4}) 會建立具名群組,並以名稱顯示,ISO 日期範例就是如此。常用樣式選單會插入經過測試的起點樣式,包括電子郵件地址、URL、IPv4 位址、十六進位色碼、UUID、重複單字與行尾空白。請把電子郵件樣式當作初步檢查,而不是驗證:完整的地址語法寬鬆得多,真正的測試只有實際寄出一封信。
後行斷言(lookbehind)與災難性回溯
環顧(lookaround)會檢查某個位置前後的內容,而不消耗字元。先行斷言 (?=…) 與 (?!…) 一直都是 JavaScript 的一部分;後行斷言 (?<=…) 與 (?<!…) 於 ES2018 出現,2023 年 Safari 16.4 推出後,所有主流瀏覽器都已支援。因此 (?<=\$)\d+ 能在 "$42" 中找到 42,且不包含美元符號。與許多其他引擎不同,JavaScript 允許任意長度的後行斷言。
JavaScript 引擎採用回溯機制:某條路徑失敗時,會退回去嘗試其他選項。像 (a+)+$ 這種巢狀量詞,會讓同一段文字有指數級數量的切分方式,因此 30 個 a 後面接一個 x 的字串可能要跑上數秒,再多幾個字母就可能要數小時。這就是災難性回溯,在伺服器上則會成為 ReDoS(阻斷服務攻擊);2019 年 7 月 2 日,Cloudflare 就因一條有這種缺陷的 WAF 規則,導致網路中斷約半小時。由於本測試工具在你的分頁中執行,這類樣式可能讓頁面凍結;請重新載入並改寫,讓兩個量詞不會搶同一批字元,例如用 [^,]* 這種更精確的字元類別取代 .*,或加上錨點。若要編輯文字本身而不是比對文字,請參閱文字工具;更多開發者工具在開發者工具頁面。
常見問題
- 為什麼我的正規表示式只找到一個比對結果?
- 可能是沒有開啟 g 旗標。沒有它的話,引擎在第一個符合結果後就會停止。勾選 g 即可列出所有出現的位置;單獨使用 y 旗標也能找到多個,但前提是它們必須彼此緊接。
- 在 JavaScript 中,\d 會比對其他文字系統的數字嗎?
- 不是。在 JavaScript 中,\d 只代表 0 到 9,\w 只代表 ASCII 字母、數字與底線,即使加上 u 旗標也一樣。若要處理其他文字系統,請搭配 u 使用 \p{Nd} 或 \p{L}。
- 在這裡測試的模式,在 Python 或 PHP 中會有相同結果嗎?
- 基本語法可以沿用,但細節不同:Python 的具名群組寫成
(?P<name>…),PHP 與 Python 支援 JavaScript 沒有的佔有量詞,後行斷言的規則也各不相同。請在目標引擎中重新測試。 - 如何比對字面上的點號或括號?
- 用反斜線跳脫:
\.比對句點,\[比對左方括號。在字元類別內,大多數符號本來就是字面意思,所以[.]同樣只會比對句點。 - 為什麼我在輸入模式時頁面卡住了?
- 該樣式可能對你的文字觸發了災難性回溯。請重新載入,然後避免
(.*)*或(a+)+這類巢狀量詞,並讓每個部分盡可能少比對。