JavaScript Regular Expression - quantifiers、anchors (assertions)、groups
一、Quantifiers
1、「n?」:n 為任意字元或字串,意指該字元或字串連續出現次數可以是 0 ~ 1 次。
var str = "a-a12-a1212"; console.log(str.replace(/a(12)?/g, "***"));
其結果為 "***-***-***12"
2、「n+」:n 為任意字元或字串,意指該字元或字串連續出現次數可以是 1 ~ ∞ 次。
var str = "he\nhi\nam\nhim"; console.log(str.match(/h.+/gm));
其結果為 ["he", "hi", "him"]
3、「n*」:n 為任意字元或字串,意指該字元或字串連續出現次數可以是 0 ~ ∞ 次。
var str = "a123b123123c"; console.log(str.replace(/(123)*/g, ""));
其結果為 "abc"
4、「n{X}」:n 為任意字元或字串,意指該字元或字串連續出現次數固定為 X 次。
var str = "1-123-123123-123123123"; console.log(str.replace(/(123){2}/g, "*"));
其結果為 "1-123-*-*123"
5、「n{X,}」:n 為任意字元或字串,意指該字元或字串連續出現次數固定為 X ~ ∞ 次。
var str = "1-123-123123-123123123"; console.log(str.replace(/(123){2,}/g, "*"));
其結果為 "1-123-*-*"
5、「n{,Y}」:n 為任意字元或字串,意指該字元或字串連續出現次數固定為 0 ~ Y 次。
沒有這種東西。
6、「n{X,Y}」:n 為任意字元或字串,意指該字元或字串連續出現次數可以是 X ~ Y 次。
var str = "a-a12-a1212"; console.log(str.replace(/a(12){1,2}/g, "***"));
其結果為 "a-***-***"
二、anchors (assertions)
1、「\bn」:n 為任意字元或字串,其位置位於由「邊」區分出文字的開頭或結尾。
var str = "a 1a2 12a a12"; console.log(str.replace(/\ba/g, "*"));
其結果為 "* 1a2 12a *12"
說明:
只要非英文或數字都可視為合法的「邊」。
例如:空白、逗號、句號、中文字、其他特殊符號都可視為「邊」。
var str = "a 1a2 12a a12"; console.log(str.replace(/a\b/g, "*"));
其結果為 "* 1a2 12* a12"
2、「\Bn」:表示一個 n 字元或字串,其位置不在於由「邊」區分出文字的開頭或結尾。
var str = "a 1a2 12a a12"; console.log(str.replace(/\Ba/g, "*"));
其結果為 "a 1*2 12* a12"
var str = "a 1a2 12a a12"; console.log(str.replace(/a\B/g, "*"));
其結果為 "a 1*2 12a *12"
3、「^n」:n 為任意字元或字串,其位置位於每行字串的開頭。
var str = "he\nah\nam\nhim"; console.log(str.match(/^h.+/gm));
其結果為 ["he", "him"]
4、「n$」:n 為任意字元或字串,其位置位於每行字串的結尾。
var str = "he\nah\nam\nhim"; console.log(str.match(/.+h$/gm));
其結果為 ["ah"]
5、「n(?=z)」:Zero-Width Positive Lookahead Assertions
n 為任意字元或字串,z 為任意字元或字串,
其位置位於比對樣本的前面,並且該比對樣本的內容要等於 z。
var str = "this is cat bearcat bigbearcat"; console.log(str.replace(/bear(?=cat)/g, "*"));
其結果為 "this is cat *cat big*cat"
6、「n(?!z)」:Zero-Width Negative Lookahead Assertions
n 為任意字元或字串,z 為任意字元或字串,
其位置位於比對樣本的前面,並且該比對樣本的內容不等於 z。
var str = "this is bear bearcat bigbearcat"; console.log(str.replace(/bear(?!cat)/g, "*"));
其結果為 "this is * bearcat bigbearcat"
7、「(?<=z)n」:Zero-Width Positive Lookbehind Assertions
n 為任意字元或字串,z 為任意字元或字串,
其位置位於比對樣本的後面,並且該比對樣本的內容要等於 z。
var str = "this is cat bearcat bigbearcat"; console.log(str.replace(/(?<=bear)cat/g, "*"));
其結果為 "this is cat bear* bigbear*"
8、「(?<!z)n」:Zero-Width Negative Lookbehind Assertions
n 為任意字元或字串,z 為任意字元或字串,
其位置位於比對樣本的後面,並且該比對樣本的內容不等於 z。
var str = "this is cat bearcat bigbearcat"; console.log(str.replace(/(?<!bear)cat/g, "*"));
其結果為 "this is * bearcat bigbearcat"
三、groups
1、「(a|b)」:a、b 為任意字元或字串,只要等於比對樣本裡的內容皆符合條件。
var str = "this is bear bearcat bigbearcat"; console.log(str.replace(/(this)/g, "*"));
其結果為 "* is bear bearcat bigbearcat"
var str = "this is bear bearcat bigbearcat"; console.log(str.replace(/(cat|this)/g, "*"));
其結果為 "* is bear bear* bigbear*"
var str = "this is bear bearcat bigbearcat"; console.log(str.replace(/(this|is|cat)/g, "*"));
其結果為 "* * bear bear* bigbear*"
2、「(?<Name>x)」:Named capturing group
let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; let result = re.exec('2015-01-02'); console.log(result.groups.year); console.log(result.groups.month); console.log(result.groups.day); console.log(result[0]); console.log(result[1]); console.log(result[2]); console.log(result[3]);
其結果為
3、「(?:x)」:Non-capturing group,表示僅需要用作 group 的用途,但不需要擷取群組。
var str = "$12.34"; var pattern = /(?:\$)(\d{2})\.(\d{2})/; var match = pattern.exec(str); console.log(match);
其結果為
參考資料: