在JS中使用正規表示式(2種方式)

2020-07-16 10:05:03
在 JavaScript 中有兩種方式使用正規表示式。

構造正規表示式

使用 RegExp 建構函式可以定義正規表示式物件,具體語句格式如下:

new RegExp(pattern, attributes);

引數 pattern 是一個字串,指定匹配模式或者正規表示式物件。引數 attributes 是一個可選的修飾性標誌,包含 "g" "i" 和 "m" 三個選項,分別設定全域性匹配、區分大小寫的匹配和多行匹配;如果引數 pattern 是正規表示式物件,則必須省略該引數。

該函數返回一個新的 RegExp 物件,該物件包含指定的匹配模式和匹配標誌。

範例1

下面範例使用 RegExp 建構函式定義了一個簡單的正規表示式,匹配模式為字元“a”,沒有設定第二個引數,所以這個正規表示式只能匹配字串中第一個小寫字母“a”,後面的字母“a”將無法被匹配到。
var r = new RegExp("a");   //構造最簡單的正規表示式
var s = "JavaScript != JAVA";  //定義字串直接量
var a = s.match(r);  //呼叫正規表示式執行匹配操作,返回匹配的陣列
console.log(a);  //返回陣列["a"]
console.log(a.index);  //返回值為1,匹配的下標位置

範例2

如果希望匹配字串中所有的字母 a,且不區分大小寫,則可以在第 2 個引數中設定 g 和 i 修飾詞。
var r = new RegExp("a", "gi");  //設定匹配模式為全域性匹配,且不區分大小寫
var s = "JavaScript != JAVA";  //字串直接量
var a = s.match(r);  //匹配查詢
console.log(a);  //返回陣列["a", "a", "A", "A"]

範例3

在正規表示式中可以使用特殊字元。下面範例的正規表示式將匹配字串“JavaScript JAVA”中每個單詞的首字母。
var r = new RegExp("bw", "gi");  //構造正規表示式物件
var s = "JavaScript JAVA";  //字串直接量
var a = s.match(r);  //匹配查詢
console.log(A);  //返回陣列["j", "J"]
在上面範例中,字串 "bw" 表示一個匹配模式,其中 “b" 表示單詞的邊界,"w" 表示任意 ASCII 字元,反斜槓表示跳脫序列。為了避免 Regular() 建構函式的誤解,必須使用“”替換所有“”字元,使用雙反斜槓表示斜槓本身的意思。

在指令碼中動態建立正規表示式時,使用建構函式 RegExp() 會更方便。例如,如果檢索的字串是由使用者輸入的,那麼就必須在執行時使用 RegExp() 建構函式來建立正規表示式,而不能使用其他方法。

範例4

如果 RegExp() 建構函式的第 1 個引數是一個正規表示式,則第 2 個引數可以省略。這時 RegExp() 建構函式將建立一個引數相同的正規表示式物件。
var r = new RegExp("bw", "gi");  //構造正規表示式
var r1 = new RegExp(r);  //把正規表示式傳遞給RegExp()建構函式
var s = "JavaScript JAVA";  //字串直接量
var a = s.match(r);  //匹配查詢
console.log(a);  //返回陣列["j", "J"]
把正規表示式直接量傳遞給 RegExp() 建構函式,可以進行型別封裝。

範例5

RegExp() 也可以作為普通函數使用,這時與使用 new 運算子呼叫建構函式功能相同。不過如果函數的引數是正規表示式,那麼它僅返回正規表示式,而不再建立一個新的 RegExp() 物件。
var a = new RegExp("bw", "gi");  //構造正規表示式物件
var b = new RegExp(a);  //對正規表示式物件進行再封裝
var c = RegExp(a);  //返回正規表示式直接量
console.log(a.constructor == RegExp);  //返回true
console.log(b.constructor == RegExp);  //返回true
console.log(c.constructor == RegExp);  //返回true

正規表示式直接量

正規表示式直接量使用雙斜槓作為分隔符進行定義,雙斜槓之間包含的字元為正規表示式的字元模式,字元模式不能使用引號,標誌字元放在最後一個斜槓的後面。語法如下:

/pattern/attributes

範例6

下面範例定義一個正規表示式直接量,然後進行呼叫。
var r = /bw/gi;
var s = "JavaScript JAVA";
var a = s,match(r);  //直接呼叫正規表示式直接量
console.log(a);  //返回陣列["j", "J"]

在 RegExp() 建構函式與正規表示式直接量語法中,匹配模式的表示是不同的。對於 RegExp() 建構函式來說,它接收的是字串,而不是正規表示式的匹配模式。所以,在上面範例中,RegExp() 建構函式中第 1 個引數裡的特殊字元,必須使用雙反斜槓來表示,以防止字串中的字元被 RegExp() 建構函式跳脫。同時對於第 2 個引數中的修飾符詞也應該使用引號來包含。而在正規表示式直接量中每個字元都按正規表示式來定義,普通字元與特殊字元都會被正確解釋。

範例7

在 RegExp() 建構函式中可以傳遞變數,而在正規表示式直接量中是不允許的。
var r = new RegExp("a" + s + "b", "g");  //動態建立正規表示式
var r = /"a" + s + "b"/g;  //錯誤的用法
在上面範例中,對於正規表示式直接量來說,“"”和“+”都將被視為普通字元進行匹配,而不是作為字元與變數的語法識別符號進行連線操作。

JavaScript 正規表示式支援 "g" "i" 和 "m" 三個標誌修飾符,簡單說明如下。
  • "g":global(全域性)的縮寫,定義全域性匹配,即正規表示式將在指定字串範圍內執行所有匹配,而不是找到第一個匹配結果後就停止匹配。
  • "i":case-insensitive(大小寫不敏感)中 insensitive 的縮寫,定義不區分大小寫匹配,即對於字母大小寫視為等同。
  • "m":multiline(多行)的縮寫,定義多行字串匹配。
這三個修飾詞分別指定了匹配操作的範圍、大小寫和多行行為,關鍵詞可以自由組合。