let reg = /[a-z][0-9]/g;
const str = "za1zb2zc3";
let result;
while (result = reg.exec(str)) {
console.log(reg.lastIndex, result, result.index, result.input);
}
// 出力:3 Array [ "a1" ] 1 za1zb2zc3
// 出力:6 Array [ "b2" ] 4 za1zb2zc3
// 出力:9 Array [ "c3" ] 7 za1zb2zc3
reg =/([a-z])([0-9])/g;
while (result = reg.exec(str)) {
console.log(reg.lastIndex, result, result.index, result.input);
}
// 出力:3 Array(3) [ "a1", "a", "1" ] 1 za1zb2zc3
// 出力:6 Array(3) [ "b2", "b", "2" ] 4 za1zb2zc3
// 出力:9 Array(3) [ "c3", "c", "3" ] 7 za1zb2zc3
// 名前付きキャプチャ
const regex1 = /(?<w1>[a-z]+1) (?<w2>[a-z]+2) (?<w3>[a-z]+3)/;
let result = regex1.exec("word1 word2 word3 word4");
console.log(result[0]); // 出力:word1 word2 word3
console.log(result[1]); // 出力:word1
console.log(result[2]); // 出力:word2
console.log(result[3]); // 出力:word3
console.log(result.index); // 出力:0
console.log(result.input); // 出力:word1 word2 word3 word4
console.log(result.groups.w1); // 出力:word1
console.log(result.groups.w2); // 出力:word2
console.log(result.groups.w3); // 出力:word3
console.log(result.length); // 出力:4
// 後方参照 (キャプチャ名)
const regex2 = /(?<w1>[a-z]+1) (?<w2>[a-z]+2) \k<w2>/;
result = regex2.exec("word1 word2 word1 word3");
console.log(result); // 出力:null
result = regex2.exec("word1 word2 word2 word3");
console.log(result[0]); // 出力:word1 word2 word2
console.log(result[1]); // 出力:word1
console.log(result[2]); // 出力:word2
console.log(result.index); // 出力:0
console.log(result.input); // 出力:word1 word2 word2 word3
console.log(result.groups.w1); // 出力:word1
console.log(result.groups.w2); // 出力:word2
console.log(result.length); // 出力:3
// 後方参照 (キャプチャ番号) 上記と同等
const regex3 = /(?<w1>[a-z]+1) (?<w2>[a-z]+2) \2/;
result = regex3.exec("word1 word2 word2 word3");
console.log(result[0]); // 出力:word1 word2 word2
console.log(result[1]); // 出力:word1
console.log(result[2]); // 出力:word2
console.log(result.index); // 出力:0
console.log(result.input); // 出力:word1 word2 word2 word3
console.log(result.groups.w1); // 出力:word1
console.log(result.groups.w2); // 出力:word2
console.log(result.length); // 出力:3
// 先読み・後読み
const str = "word1 word2 word3 word2 word4";
// 肯定先読み:"word1 word2 word3 word2 word4"
let result = /(word2) (?=word3)([a-z0-9]+)/.exec(str);
console.log(result.index); // 出力:6
console.log(result[0]); // 出力:word2 word3
console.log(result[1]); // 出力:word2
console.log(result[2]); // 出力:word3
// 否定先読み:"word1 word2 word3 word2 word4"
result = /(word2) (?!word3)([a-z0-9]+)/.exec(str);
console.log(result.index); // 出力:18
console.log(result[0]); // 出力:word2 word4
console.log(result[1]); // 出力:word2
console.log(result[2]); // 出力:word4
// 肯定後読み:"word1 word2 word3 word2 word4"
result = /([a-z0-9]+)(?<=word3) (word2)/.exec(str);
console.log(result.index); // 出力:12
console.log(result[0]); // 出力:word3 word2
console.log(result[1]); // 出力:word3
console.log(result[2]); // 出力:word2
// 否定後読み:"word1 word2 word3 word2 word4"
result = /([a-z0-9]+)(?<!word3) (word2)/.exec(str);
console.log(result.index); // 出力:0
console.log(result[0]); // 出力:word1 word2
console.log(result[1]); // 出力:word1
console.log(result[2]); // 出力:word2
// d【キャプチャ部分の範囲インデックス取得】フラグ + 名前付きキャプチャ
// 0123456789+123456789+123456789+123456789+123
const str = 'The quick brown fox jumps over the lazy dog.';
const regex = /(?<Fox>[a-z]+ fox)[a-z ]+ (?<Dog>[a-z]+ dog)/d;
let result = regex.exec(str);
console.log(result.length);
// 出力:3
console.log(result[0]);
// 出力:brown fox jumps over the lazy dog
console.log(result[1]);
// 出力:brown fox
console.log(result[2]);
// 出力:lazy dog
// キャプチャ部分の範囲インデックス
console.log(regex.hasIndices);
// 出力:true
console.log(result.indices.length);
// 出力:3
console.log(result.indices[0]);
// 出力:Array [ 10, 43 ]
console.log(result.indices[1]);
// 出力:Array [ 10, 19 ]
console.log(result.indices[2]);
// 出力:Array [ 35, 43 ]
// 名前付きキャプチャ
console.log(result.groups);
// 出力:Object { Fox: "brown fox", Dog: "lazy dog" }
console.log(result.groups.Fox);
// 出力:brown fox
console.log(result.groups.Dog);
// 出力:lazy dog