正規表達式
→RegEx
正規表達式
Regular Expression
常簡寫為RegEx
表達一串文字是否符合特定規則(pattern)的搜尋用模型
頭尾以斜線/包住
並可使用特殊符號加上額外條件,或代表對應的文字規律
例如:/^09\d{2}-?\d{3}-?\d{3}$/
是一串表達手機號碼的正規表達式
可用來判斷一串數字是否符合手機號碼的規則
上面範例中的
\d是「任意數字」
{2}是「這個字元(\d ,即任意數字)會出現2次」
?是「這個字元(-)沒有出現,或者只出現一次」
就會變為09+「2個任意數字」+(0或1個「-」+「3個任意數字」)*2
常用符號
指定字元
table:指定字元
. 任意字元 .n
[] 指定字元 [aeiou]
() 指定字串 (string)
- 範圍字元 [a-zA-Z]
^ 排除字元 [^a]
字元數量
table:字元數量
* 任意數量 bo*
+ 至少一個 a+
? 零或一個 e?le?
{數量} 指定數量 a{2}
{下限, 上限} 指定範圍 a{1, 3}
字元位置
table:字元位置
^ 以此開頭 ^A
$ 以此結尾 t$
為什麼正規表達式採用「^」和「$」作為行首行尾符號?
2024-03-25 Why do regexes use $ and ^ as line anchors? • Buttondown
なぜ正規表現の行頭と行末を表す記号として「^」と「$」が採用されたのか? - GIGAZINE
特殊字元
table:特殊字元
\d 數字 等同 [0-9]
\w 文數字與底線字元(_) 等同 [A-Za-z0-9_]
\s space 字元 等同 [\n\r\t]
\D 排除數字
\W 排除文數字
\S 排除 space 字元
\n 換行符號 line feed
\r 換行符號 carriage return
\t 定位字元 tab
\v 垂直定位字元 vertical tab
換行符號
目前存在:
1. LF(Line feed,U+000A)
2. CR(Carriage Return,U+000D)
3. 兩者併用的 CR+LF
由於字元集與系統差異
可以使用 [\r\n] 來選取所有換行符號
想要選取這些特殊字元,都需要在前面加上 \
[\$.|?*+( )
由於具有特殊意義
例如:\$、\*
正規表達式的漏洞
ReDoS
常用範例
西元生日
/^[1-9]\d{3}-\d{2}-\d{2}$/
身分證字號
/^[A-Z]\d{9}$/
電子郵件
2025-02-25 君はメールアドレスの正規表現を適当にググって使っていないか?
code:regex
/^a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-+@a-zA-Z0-9(?:a-zA-Z0-9-{0,61}a-zA-Z0-9)?(?:\.a-zA-Z0-9(?:a-zA-Z0-9-{0,61}a-zA-Z0-9)?)*$/
Gmail信箱
/^\w+@gmail.com$/
四則運算式
/^[\d+-*\/]*$/
2024-03-14 サクラエディタでよく使う正規表現たち【備忘録】 #備忘録 - Qiita
在VS Code的搜尋功能上使用
需啟用正規表達式搜尋功能(Alt+R)
不需在前後加上//
可用Alt + Enter一次選取所有符合規則的字元
在JavaScript上使用
宣告
需先宣告一前後由/包圍的字串
var re = /ab+c/;
或呼叫RegExp物件的建構函式
var re = new RegExp('ab+c');
函式
re.test(str)
搜尋str字串是否有部分符合
回傳boolean
re.exec(str)
搜尋str字串是否有部分符合
回傳Array
若無則回傳null
str.match(re)
搜尋str字串是否有部分符合
回傳Array
若無則回傳null
str.search(re)
搜尋str字串是否有部分符合
回傳index
若無則回傳-1
str.replace(re, newSubstr)
搜尋str字串是否有部分符合
以newSubstr取代該內容
str.split(re)
Modifiers
指定進一步的選取條件
於第二個斜線後再加上modifier
例如:var patt = /w3schools/i
會指定大小寫也要完全一致
table:Modifiers
g 搜尋所有對應內容
i 搜尋大小寫完全一致
m 搜尋多行內容