正規表達式測試器
还没有匹配结果
输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。
统计
命名分组汇总
当前没有命名分组。
免費線上正規表達式測試器(Regex Tester),支援JS即時匹配測試、擷取群組/命名群組檢視、取代預覽、正規語法解釋,內建Web Worker防ReDoS逾時保護,附常用正規範本庫,適合開發者快速除錯和驗證正規。
相關推薦
什麼是正規表達式(Regex/RegExp)?
正規表達式(Regular Expression,簡稱Regex/RegExp)是一種用單個字串描述、匹配一系列符合某個句法規則的字串的文字模式語言。它的歷史可以追溯到1950年代神經學家Warren McCulloch和數學家Walter Pitts提出的神經元數學模型,後來數學家Stephen Kleene在1956年在此基礎上提出了「正規集合」的代數描述。Unix之父Ken Thompson在1960年代末將正規表達式首次實作在QED編輯器中,此後正規表達式成為Unix工具鏈(grep、sed、awk、vi)的核心功能。
現代程式語言中,正規表達式幾乎是標配能力——JavaScript的RegExp、Python的re模組、Java的java.util.regex、.NET的Regex類別、Go的regexp套件都提供了正規支援。正規表達式廣泛應用於表單驗證(電子郵件/手機/身分證)、文字搜尋與取代(編輯器尋找取代)、日誌分析(擷取ERROR日誌)、網路爬蟲(HTML內容擷取)、資料清洗(ETL)、路由匹配、輸入過濾和安全防護(WAF規則)等場景。
正規表達式的核心概念包括:字元類(\d數字、\w單字元、\s空白)、量詞(*零或多、+一或多、?零或一、{n,m}指定次數)、錨點(^開頭、$結尾、\b單字邊界)、群組((...)擷取群組、(?:...)非擷取群組、(?<name>...)命名群組)、分支(|)、字元集([a-z])、環視((?=...)正向預查、(?!)負向預查)等。掌握正規可以極大提升文字處理效率,但也需要注意防範ReDoS等效能陷阱。
適用場景
- 開發表單驗證規則時線上測試電子郵件、手機、身分證字號、URL等正規是否正確
- 日誌分析時用正規擷取ERROR/INFO級別日誌中的時間戳記、錯誤訊息、IP位址
- 資料清洗/ETL時預覽正規取代效果,如日期格式轉換、敏感資訊遮罩(手機中間打星號)
- 編寫爬蟲時驗證內容擷取正規是否準確匹配目標HTML片段或JSON欄位
- 學習正規表達式時透過「解釋」面板理解每個中繼字元和量詞的含義,配合範本快速上手
- Code Review時把有疑問的正規透過分享連結發給同事,一起除錯最佳化
使用方法
- 在頂部 / / 之間的輸入框輸入正規表達式(無需自己加斜線),右側輸入旗標(如 g、gi、gim)或點擊下方按鈕切換
- 在「測試文字」區域貼上或輸入要匹配的文字內容,匹配結果會即時彩色標示顯示
- 點擊右側「匹配詳情」面板檢視每個匹配項的位置、內容、擷取群組和命名群組
- 切換到「取代區」標籤,輸入取代字串(支援$1/$&/$<name>等參考),即時預覽取代結果
- 切換到「表達式解釋」標籤,檢視自動生成的正規語法逐元素解釋
- 需要常用範本時,點擊左側「分類範本庫」選擇對應範本一鍵填入;除錯完成後點「分享」生成連結
功能特點
- Web Worker沙箱執行:正規在獨立Worker執行緒中執行,500ms逾時自動中斷,徹底防止ReDoS卡死瀏覽器
- 即時匹配+彩色標示:輸入即刻顯示匹配結果,不同匹配項用5種顏色標示區分,hover聯動詳情面板
- 擷取群組+命名群組:每個匹配項自動展開顯示所有擷取群組($1/$2)和命名群組($<name>),並彙總統計
- 取代預覽:輸入取代字串即時預覽取代結果,支援$1/$&/$`/$'/$<name>語法快捷按鈕
- 正規語法解釋:自動解析正規表達式,逐元素解釋中繼字元、量詞、群組、錨點等語法含義
- 12個常用範本:內建電子郵件/URL/手機/中文/IPv4/UUID/日期/日誌/HTML標籤等12個高頻正規範本,一鍵填入
- 6個旗標切換:g/i/m/s/u/y旗標視覺化按鈕切換,無需記憶語法
- 分享連結:一鍵生成包含pattern/flags/text的URL,複製給同事直接重現測試現場
- 執行統計:即時顯示匹配數量、執行耗時(ms)、擷取群組總數、命名群組數量
- 1500條匹配上限:自動截斷避免超長文字導致頁面卡頓,錯誤正規友善提示語法錯誤
程式碼範例
JavaScript 中正規匹配與取代
// 驗證電子郵件格式
const emailRe = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
console.log(emailRe.test('user@example.com')); // true
// 擷取命名群組(日期解析)
const dateRe = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g;
const text = '會議時間:2026-03-12,截止:2026-04-01';
const matches = [...text.matchAll(dateRe)];
for (const m of matches) {
console.log(m.groups.year, m.groups.month, m.groups.day);
}
// 取代:日期格式轉換 YYYY-MM-DD → MM/DD/YYYY
const reformatted = text.replace(dateRe, '$<month>/$<day>/$<year>');
console.log(reformatted);
// 會議時間:03/12/2026,截止:04/01/2026Python 中使用 re 模組
import re
# 尋找所有匹配項
text = '聯絡:alice@example.com,bob@test.org'
emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', text)
print(emails) # ['alice@example.com', 'bob@test.org']
# 命名群組擷取(Python 用 ?P<name> 語法)
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, '發布於 2026-03-12')
if m:
print(m.group('year'), m.group('month'), m.group('day'))
# 取代:手機號碼中間4位遮罩
phone_re = r'(1[3-9]\d)\d{4}(\d{4})'
result = re.sub(phone_re, r'\1****\2', '手機號碼:13812345678')
print(result) # 手機號碼:138****5678Java 中使用 java.util.regex
import java.util.regex.*;
class RegexDemo {
public static void main(String[] args) {
String text = "Error [2026-03-12 18:05:09] Connection failed";
// 編譯正規(生產環境應快取 Pattern 實例)
Pattern p = Pattern.compile(
"(?<level>INFO|WARN|ERROR)\\s+\\[(?<time>[^\\]]+)\\]\\s+(?<message>.+)"
);
Matcher m = p.matcher(text);
if (m.find()) {
System.out.println("級別: " + m.group("level"));
System.out.println("時間: " + m.group("time"));
System.out.println("訊息: " + m.group("message"));
}
// 取代所有數字
String cleaned = "abc123def456".replaceAll("\\d+", "*");
System.out.println(cleaned); // abc*def*
}
}常見問題
什麼是 ReDoS?為什麼正規測試需要防 ReDoS?
ReDoS(Regular Expression Denial of Service,正規表達式拒絕服務攻擊)是指某些惡意構造的正規表達式(如 `(a+)+$` 匹配長字串)會觸發災難性回溯(catastrophic backtracking),導致CPU佔用100%、瀏覽器卡死或伺服器崩潰。本工具使用 Web Worker 沙箱執行正規匹配,設定 500ms 逾時自動中斷,即使輸入會觸發回溯的惡意正規也不會卡死你的瀏覽器,這是本工具的核心安全特性。
正規表達式中 g、i、m、s、u、y 六個旗標分別是什麼意思?
g(global)全域匹配,尋找所有匹配項而非第一個;i(ignoreCase)忽略大小寫;m(multiline)多行模式,使 ^ 和 $ 匹配每行開頭/結尾;s(dotAll)讓點號 . 匹配包括換行符號在內的所有字元;u(unicode)Unicode模式,正確處理 emoji 和多位元組字元;y(sticky)黏著匹配,從 lastIndex 位置開始精確匹配。本工具提供了6個旗標的視覺化切換按鈕,點擊即可即時開關。
什麼是擷取群組和命名群組?怎麼用?
擷取群組用圓括號 `(pattern)` 包裹,匹配後可透過 $1、$2 等參考擷取子字串。命名群組用 `(?<name>pattern)` 語法,匹配後可透過 `$<name>` 參考,程式可讀性更高。例如用 `(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})` 匹配日期後,可以在取代字串中用 `$<year>年$<month>月$<day>日` 重新格式化。本工具會自動列出每個匹配的擷取群組和命名群組結果。
支援哪些程式語言的正規語法?
本工具基於 JavaScript 原生 RegExp 引擎,與 JS/TypeScript、Python re 模組、Java java.util.regex、PHP preg_*、Go regexp 等主流引擎語法大體相容(都基於 PCRE/Perl 流派),主要差異在一些進階特性(如 Python 的 `(?P<name>)` 命名群組寫法、.NET 的可變長度lookbehind)。日常開發中 99% 的正規(電子郵件、手機、URL、日期等驗證/擷取)在各引擎間通用,可以直接在本工具測試後複製到程式中使用。
如何把測試好的正規分享給同事?
點擊頂部工具列的「分享」按鈕,工具會自動將目前正規表達式、旗標、測試文字編碼到URL參數中,並複製連結到剪貼簿。同事打開連結即可看到完全一致的測試狀態(pattern+flags+testText),非常適合團隊協作和遠端除錯。
取代字串中 $1、$&、$`、$' 這些特殊符號是什麼意思?
在取代字串中:$1、$2...表示第N個擷取群組;$& 表示整個匹配的文字;$` 表示匹配文字之前的部分;$' 表示匹配文字之後的部分;$$ 表示字面值 $;$<name> 表示命名群組。例如將 `(\d{4})-(\d{2})-(\d{2})` 取代為 `$2/$3/$1` 可將 2026-03-12 轉為 03/12/2026。本工具的取代區提供了這些特殊符號的快捷插入按鈕。
術語表
- Regex / RegExp
- Regular Expression(正規表達式)的縮寫,一種描述文字匹配模式的字串語法,用於搜尋、取代、驗證文字。
- 擷取群組 (Capture Group)
- 用圓括號 (pattern) 包裹的子運算式,匹配結果可透過 $1、$2 按位置參考。
- 命名群組 (Named Group)
- 用 (?<name>pattern) 語法定義的擷取群組,可透過 $<name> 按名稱參考,比數字參考可讀性更高。
- ReDoS
- Regular Expression Denial of Service(正規拒絕服務),由災難性回溯導致正規執行時間指數級增長,卡死瀏覽器或伺服器。
- 回溯 (Backtracking)
- NFA正規引擎在嘗試匹配失敗時回退到之前位置嘗試其他可能性的機制,複雜正規可能導致指數級回溯。
- 旗標 (Flags)
- 修改正規匹配行為的參數,常見有 g(全域)、i(忽略大小寫)、m(多行)、s(dotAll)、u(Unicode)、y(黏著)。
- 環視 (Lookaround)
- 零寬斷言,包括正向預查 (?=...)、負向預查 (?!)、正向回顧 (?<=...)、負向回顧 (?<!...),只判斷位置不消耗字元。
- PCRE
- Perl Compatible Regular Expressions(Perl相容正規表達式),一種廣泛使用的正規語法標準,被PHP、Java、Python等多數語言採用。
- Web Worker
- 瀏覽器提供的獨立於主執行緒的背景執行緒API,本工具用它在Worker中執行正規,即使發生ReDoS也不阻塞UI。
- 量詞 (Quantifier)
- 指定前一元素重複次數的語法:*(0或多)、+(1或多)、?(0或1)、{n}(恰好n次)、{n,m}(n到m次)。
正規表達式常用中繼字元速查表
| 中繼字元 | 含義 | 範例說明 |
|---|---|---|
. | 任意單個字元(不含換行,s旗標下含換行) | a.c 匹配 abc、aXc,不匹配 a\nc |
\d | 數字字元,等價於 [0-9] | \d{3} 匹配 123、456 |
\w | 單字字元,等價於 [A-Za-z0-9_] | \w+ 匹配 hello_123 |
\s | 空白字元(空格/定位字元/換行等) | a\sb 匹配 a b(中間空格) |
^ | 字串開頭(m旗標下為行首) | ^Hello 匹配行首的Hello |
$ | 字串結尾(m旗標下為行尾) | end$ 匹配行尾的end |
\b | 單字邊界 | \bcat\b 匹配獨立單字cat,不匹配category |
* | 前一元素重複 0 次或多次(貪婪) | ab*c 匹配 ac、abc、abbc |
+ | 前一元素重複 1 次或多次 | ab+c 匹配 abc、abbc,不匹配ac |
? | 前一元素 0 次或 1 次(或用於非貪婪/環視) | colou?r 匹配 color和colour |
| | 分支/或,匹配左邊或右邊 | cat|dog 匹配cat或dog |
[...] | 字元集合,匹配其中任一字元 | [aeiou] 匹配任一元音字母 |
常用正規表達式速查範本
| 用途 | 正規表達式 | 推薦旗標 |
|---|---|---|
| 電子郵件地址 | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} | g |
| 中國大陸手機號碼 | 1[3-9]\d{9} | g |
| URL連結 | https?:\/\/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b[-a-zA-Z0-9()@:%_+.~#?&/=]* | gi |
| IPv4位址 | \b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b | g |
| 日期 YYYY-MM-DD | \d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01]) | g |
| 身分證字號(18位) | [1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx] | g |
| UUID | [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12} | gi |
Authoritative References
- MDNMDN: RegExp 官方文件
- Wikipedia正規表達式 - 維基百科
- OWASPOWASP: ReDoS 攻擊防護指南
- 色盲模擬器
- 色彩轉換器
- .htaccess 轉 Nginx 轉換器
- SQL 轉換器
- Cookie 解析器
- Cron 表達式產生器
- Cron 表達式驗證器
- CSS 格式化
- CSS 壓縮
- CSV 轉 Excel
- 貨幣轉換器
- 差異檢查器
- 網站圖示產生器
- XML 格式化
- 十六進位轉換器
- HTML 格式化
- HTML 壓縮
- HTML 轉 Markdown
- Markdown 轉 HTML
- JavaScript 格式化工具
- JS 壓縮
- JSX 格式化工具
- JSX 壓縮
- 關鍵字聚類
- Lorem Ipsum 產生器
- Markdown 表格產生器
- Meta Tag 產生器
- 密碼產生器
- 密碼強度檢測工具
- QR Code/條碼產生器
- 正規表達式測試器
- Slug 產生器
- SQL 產生器
- SQL 格式化工具
- 字數統計
- 時間工具
- TS 格式化
- TS 壓縮
- TSX 格式化
- TSX 壓縮
- Unix 時間戳轉換
- UUID 產生器
- YAML 格式化
- 大小寫轉換器