JavaScript Regular Expression - Modifier
一、
Regular Expression 用於文字的找尋與取代
在 javascript regular expression Syntax 為:/pattern/modifiers
如下範例
var reg = /hi/g; var str = "she hi am hi"; console.log(str.replace(reg, "hello"));
其結果為 she hello am hello
也等於
var str = "she hi am hi"; console.log(str.replace(/hi/g, "hello"));
也等於
var reg = new RegExp(/hi/g); var str = "she hi am hi"; console.log(str.replace(reg, "hello"));
也等於
var reg = new RegExp(/hi/, "g"); var str = "she hi am hi"; console.log(str.replace(reg, "hello"));
另外 RegExp 也支持以下無 modifiers 寫法
var reg = new RegExp("hi"); var str = "she hi am hi"; console.log(str.replace(reg, "hello"));
其結果為 "she hello am hi"
二、Modifier
Modifiers 有三種,以下各示範有加該 Modifier 與沒加的差別
1、g:Perform a global match
var str = "she hi am hi"; console.log(str.replace(/hi/, "hello"));
其結果為 she hello am hi
var str = "she hi am hi"; console.log(str.replace(/hi/g, "hello"));
其結果為 she hello am hello
2、i:Perform case-insensitive matching
var str = "she Hi am hi"; console.log(str.replace(/hi/, "hello"));
其結果為 she Hi am hello
var str = "she Hi am hi"; console.log(str.replace(/hi/i, "hello"));
其結果為 she hello am hi
Modifiers 不一定只能放一個,也沒有先後順序之分
var str = "she Hi am hi"; console.log(str.replace(/hi/gi, "hello"));
其結果為 she hello am hello
3、m:Perform multiline matching
var str = "she is she \nI am dog \nshe is pig \nthis is bug";
其字串在我們人類看起來是長這樣的
"she is she
I am dog
she is pig
this is bug"
現有一個需求,要把每行開頭的 she 替換成 he,要如何做?
console.log(str.replace(/she/g, "he"));
"he is he
I am dog
he is pig
this is bug"
使用了 Modifier「g」,替換了所有的 she,但我只想要把每行開頭的 she 替換成 he…
console.log(str.replace(/^she/g, "he"));
"he is she
I am dog
she is pig
this is bug"
使用了 anchor「^」表示每行字串的開頭,也使用了 Modifier「g」表示替換所有符合的項目,
但為何 she is pig 的 she 沒替換掉?
原因在於現在整個 str 字串被視為一行,當然只有 she is she 的 she 被替換掉而已。
console.log(str.replace(/^she/gm, "he"));
"he is she
I am dog
he is pig
this is bug"
使用了 Modifier「m」表示一字串裡每遇到「\n」字元 (或是「\r」字元) 時,就會再分成一行字串,
現在 parser 已確實視為 str 字串共有四行字串,因此每行字串開頭的 she 自然就被替換掉了。
4、u:treat pattern as a sequence of Unicode code points
參考資料: