正則表達式筆記(二)

JS 中的正則表達式

概述

在 JS 中,正則表達式是個 RegExp 對象,具備 exectest 方法。而在 String 對象中,也存在 matchreplacesearchsplit 操做正則表達式的方法。正則表達式

聲明

JS 中的正則表達式有兩種聲明方式(對象字面量 / 構造函數),都會生產一個 RegExp 對象的實例。數組

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

RegExp 對象

實例函數

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

實例以後的 pattern 對象就具備如下屬性:ui

  • lastIndex:下次開始匹配的字符串位置,如果無設置全局模式,會始終爲 0
  • ignoreCase:是否設置忽略大小寫模式
  • global:是否設置了全局匹配模式
  • multiline:是否設置了多行模式
  • source:正則表達式的文本內容

注意使用構造函數聲明正則表達式的時候,需合理使用轉義符。code

方法對象

RegExp.exec 檢索字符串中指定的值。返回一個結果數組。該方法老是返回單詞匹配的結果。字符串

在正則表達式設置了 g 模式的狀況下,會同時更新 RegExp 對象的 lastIndex 屬性。input

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 對象),同時必須設置全局模式,可能會形成死循環。it

RegExp.test 執行檢索字符串中指定值的操做。返回 truefalseconsole

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"]
相關文章
相關標籤/搜索