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

 

參考資料:

Modifier (flags)