1. 惰性匹配
如 Hi+?
只會匹配 Hiiiii
中的 Hi
'Hiii'.replace(/Hi+?/, 'x') // xii
'Hiii'.replace(/Hi+/, 'x') // x
'Hellollo'.replace(/H.*?llo/, 'x') // xllo
'Hellollo'.replace(/H.*llo/, 'x') // x
'yoooooo'.replace(/yo{2,6}?/, 'x') // xoooo
'yoooooo'.replace(/yo{2,6}/, 'x') // x
2. 單詞邊界
'How are you?'.replace(/\b.+?\b/, 'x') // x are you?
3. 捕獲組引用
捕獲組表現形式: (xxx)
, 反向引用: \n
, 如: \1
, \2
等
'How are you?'.replace(/(how)/i, '$1 old') // How old are you?
'1#2#3'.replace(/^(\d)#(\d)#(\d)$/i, '$1 $2 $3') // 1 2 3
'111#111#111'.replace(/^(\d+)#\1#\1$/i, '$1') // 111
4. 命名捕獲組 + 反向引用
命名捕獲組: (?<name>xxx)
, 反向引用: \k<name>
'111#111'.replace(/^(?<num>\d+)#\k<num>$/i, '$<num>') // 111
5. 位置斷言
包括:
- 正向先行斷言:
(?=xx)
- 反向先行斷言:
(?!xx)
, 反向即: 不能匹配 - 正向後行斷言:
(?<=xx)
- 反向後行斷言:
(?<!xx)
, 反向即: 不能匹配
6. 修飾符
除了常用的 g
全局匹配,i
忽略大小寫之外:
m
: multiline 簡寫,多行匹配,把^
和$
變成行開頭和行結尾。u
: unicode 簡寫,允許使用 Unicode 點轉義符y
: sticky 簡寫,開啟粘連匹配,正則表達式執行粘連匹配時試圖從最後一個匹配位置開始
7. replace 第二個參數
如果是字符串,可以用以下的特殊字符:
$n
x: 1<=n<=99, 匹配第 1-99 個分組裡捕獲的文本$&
: 匹配到的子串文本$`
: 匹配到的子串的左邊文本$'
: 匹配到的子串的右邊文本$$
: 美元符號$<name>
: 命名分組捕獲的結果值
如果是函數,函數的返回值作為替換字符串。並且函數遵循以下規則:
- 第 1 個參數為匹配的子串,對應於上述的
$&
- 第 1+1=2 個到第 n+1 個參數為對應的第 1 到第 n 個分組(如果有)
- 第 n+2 個參數為 offset, 即匹配到的子字符串在原字符串中的偏移量
- 第 n+3 個參數為被匹配的原字符串
- 第 n+4 個參數為命名捕獲組匹配的對象