JS 中的正規表示式
概述
在 JS 中,正規表示式是個 RegExp
物件,具有 exec
,test
方法。而在 String
物件中,也存在 match
,replace
,search
,split
操作正規表示式的方法。
宣告
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
執行檢索字串中指定值的操作。返回 true
或 false
。
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.$1
,RegExp.$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"]