正規表示式筆記(二)

ideaspace發表於2015-05-05

JS 中的正規表示式

概述

在 JS 中,正規表示式是個 RegExp 物件,具有 exectest 方法。而在 String 物件中,也存在 matchreplacesearchsplit 操作正規表示式的方法。

宣告

JS 中的正規表示式有兩種宣告方式(物件字面量 / 建構函式),都會生產一個 RegExp 物件的例項。

/pattern/flags
new RegExp(pattern[, flags])

RegExp 物件

例項

var pattern = /quicks(brown).+?(jumps)/ig;
var pattern = new RegExp("quick\s(brown).+?(jumps)","ig");

例項之後的 pattern 物件就具有以下屬性:

  • lastIndex:下次開始匹配的字串位置,若是無設定全域性模式,會始終為 0
  • ignoreCase:是否設定忽略大小寫模式
  • global:是否設定了全域性匹配模式
  • multiline:是否設定了多行模式
  • source:正規表示式的文字內容

注意使用建構函式宣告正規表示式的時候,需合理使用轉義符。

方法

RegExp.exec 檢索字串中指定的值。返回一個結果陣列。該方法總是返回單詞匹配的結果。

在正規表示式設定了 g 模式的情況下,會同時更新 RegExp 物件的 lastIndex 屬性。

var result = re.exec(`The Quick Brown Fox Jumps Over The Lazy Dog`);
// console.log(result)
// ["Quick Brown Fox Jumps", "Brown", "Jumps"]

var pattern = /ab*/g;
var str = `abbcdefabh`;
var matchArray;
while ((matchArray = pattern.exec(str)) !== null) {
  var msg = `Found ` + matchArray[0] + `. `;
  msg += `Next match starts at ` + pattern.lastIndex;
  //console.log(msg);
  // Found abb. Next match starts at 3
  // Found ab. Next match starts at 9
}

使用迴圈的時候,不要把正規表示式的操作放置在迴圈體中(這樣每次都會重新生成 RegExp 物件),同時必須設定全域性模式,可能會造成死迴圈。

RegExp.test 執行檢索字串中指定值的操作。返回 truefalse

var pattern = /^d{4}-d{2}-d{2}$/;
var result = re.test(`2010-12-20`);

console.log(result)
// true

在正規表示式設定了 g 模式的情況下,跟 RegExp.exec 一樣,會同時更新 RegExp 物件的 lastIndex 屬性。

var pattern = /^d{4}-d{2}-d{2}$/g;
pattern.test(`2010-12-20`); // true
pattern.test(`2010-12-20`); // false

RegExp.test 在匹配成功之後,各個捕獲分組的文字會儲存下來,用 RegExp.$1RegExp.$2··· 就可以獲得,不過,儲存整個表示式匹配文字的 RegExp.$0 並不存在。

String 物件

方法

String.match 返回一個結果陣列或null

在正規表示式設定了 g 模式的情況下,match 預設返回所有可能的匹配結果。

var str = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`;
var re = /[A-E]/gi;
var matches = str.match(re);

console.log(matches);
// [`A`, `B`, `C`, `D`, `E`, `a`, `b`, `c`, `d`, `e`]

如果正規表示式沒有設定 g 模式,那麼 match 方法返回的結果與 RegExp.exec() 一致。

var str = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`;
var re = /[A-E]/i;
var matches_1 = str.match(re);
var matches_2 = re.exec(str)

console.log(matches_1, matches_2)

//[ `A`,
  index: 0,
  input: `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz` ]

該返回結果包含匹配的字串,還有一個額外的 index 屬性,表示匹配字串的位置,input 屬性即是所傳入的字串。

String.search 返回第一次匹配的位置或 -1

該方法用來尋找某個正規表示式在字串中第一次匹配成功的位置,失敗的時候返回 -1

這個方法只能找到“第一次”,即使設定了 g 模式,結果也不會有任何變化,所以如果需要使用一個正規表示式多次驗證字串,呼叫該方法判斷結果是否為 0,是更好的辦法。

"1234".search(/^d+$/g) == 0 // true
"5678".search(/^d+$/g) == 0 // true

var pattern = /^d+$/g;
pattern.test("1234"); // true
pattern.test("5678"); // false

String.split 使用一個正規表示式來切割字串。返回陣列

正規表示式是否設定了g模式對結果沒有影響。

var matchArray = "a b c".split(/s+/);

console.log(matchArray);
// ["a", "b", "c"]

也可以設定第二個引數 limit,指定返回陣列的數目。在 JS 中,該引數取值的結果如下

取值 結果
limit < 0 || limit > n 等同於未指定
0<=limit<=n 返回一個包含 n 元素的陣列
var matchArray = "a b c".split(/s+/,2);

console.log(matchArray);
// ["a", "b"]

相關文章