🌐 ZH-TW

🔣 正規表示式測試器

即時測試正規表示式模式並檢視比對結果。提供旗標設定、分組擷取與常用模式庫。

常用模式

指南

瞭解更多

01

1. 正規表示式基礎

正規表示式(Regular Expression,Regex)是用來定義、搜尋、擷取與取代字串模式的強大工具。可以按字面比對(\d 代表數字,\w 代表單詞字元),也可以用特殊字元表達複雜的模式。例如:^[a-z]+$ 表示僅包含小寫字母的字串。^ 代表開頭,$ 代表結尾,[a-z] 代表 a 到 z,+ 代表一個或多個。幾乎所有程式語言與文字編輯器都支援它,是輸入驗證、資料解析與文字取代不可或缺的工具。

02

2. 常用模式合集

實務上經常使用的正規表示式模式如下。電子郵件:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$,電話號碼(美國):^(\+1)?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$,URL:^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b,日期(YYYY-MM-DD):^\d{4}-\d{2}-\d{2}$,密碼(至少 8 碼,需含大寫+小寫+數字+特殊字元):^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$。請以這些模式為基礎,依專案需求修改後使用。

03

3. 正規表示式旗標說明

正規表示式旗標用來控制搜尋行為。g(global):尋找所有比對結果,而不只是第一個。i(ignoreCase):不區分大小寫(/hello/i 可比對 Hello、HELLO)。m(multiline):^ 和 $ 會比對每一行的開頭/結尾。s(dotAll):. 也會比對換行符號(\n)。u(unicode):正確處理完整的 Unicode(例如表情符號)。y(sticky):僅從 lastIndex 位置開始搜尋。例如:/hello/gi 會忽略大小寫並找出所有 hello。

04

4. 擷取群組與反向參照

用括號 () 建立群組,可以擷取比對到的部分以供之後使用。例如:/(\d{4})-(\d{2})-(\d{2})/ 中,$1 是年,$2 是月,$3 是日。JavaScript 的 match() 結果陣列會包含擷取群組。反向參照 \1、\2 會比對與前面群組相同的文字。例如:/(\w+)\s+\1/ 可比對「hello hello」。非擷取群組 (?:) 只做分組但不擷取,效能較佳。

05

5. 前瞻與後顧

前瞻(lookahead)與後顧(lookbehind)用來檢查特定模式的前後內容,但不會將其納入比對結果中。正向前瞻 (?=):/\d(?=px)/ 僅比對 px 前面的數字(「100px」中的 100)。負向前瞻 (?!):/\d(?!px)/ 比對不在 px 前面的數字。正向後顧 (?<=):/(?<=\$)\d+/ 僅比對 $ 後面的數字(「$100」中的 100)。負向後顧 (?<!):則相反。在密碼驗證中經常用來檢查是否包含特定字元。

06

6. 正規表示式效能最佳化

複雜的正規表示式可能引發效能問題。應盡可能寫得具體(用 [a-z]+ 而不是 .*)。將不必要的擷取群組替換為非擷取群組 (?:)。為了減少回溯(backtracking),使用惰性量詞(*?、+?)取代貪婪量詞(*、+)。對於大量文字,字串方法(indexOf、startsWith)可能比正規表示式更快。應預先編譯正規表示式以便重複使用(避免反覆建立 new RegExp)。請留意 ReDoS(Regular Expression Denial of Service,正規表示式阻斷服務)攻擊,切勿將使用者輸入直接當作正規表示式模式使用。