JavaScript 正規表現のフラグ
g グローバルフラグ
JavaScript 正規表現の g フラグはグローバルフラグです。
g フラグがない場合は、String の match() メソッドなどで見つかったマッチ場所を返すだけですが、 g フラグがある場合、パターンに合致する箇所を全て返します。
const s = '123 4567'
for (let m of s.match(/\d+/)) {
console.log(m)
// 123
}
// w/ g flag
for (let m of s.match(/\d+/g)) {
console.log(m)
// 123
// 4567
}
i 大文字小文字を区別しない
JavaScript 正規表現の i フラグはケースインセンシティブ・フラグです。つまり、アルファベットの大文字・小文字を区別しません。
const s = 'JavaScript'
console.log(/javascript/.test(s)) // false
console.log(/javascript/i.test(s)) // true
m 複数行
JavaScript 正規表現の m フラグはマルチライン (複数行) フラグです。
m フラグを指定しない場合は、 ^ と $ はそれぞれ、「文字列の先頭」と「文字列の末尾」の意味ですが、 m フラグを指定している場合には、それぞれ「行の先頭」と「行の末尾」を意味します。
const s = `ABC
123
XYZ`
console.log(/^\d+$/.test(s)) // false
console.log(/^\d+$/m.test(s)) // true
s . が行末文字にもマッチ
JavaScript 正規表現の s フラグを指定すると任意の文字を表す . が行末文字にもマッチします。
詳しくは「文字クラス . 任意の文字」を参照してください。
u Unicode 文字
JavaScript 正規表現の u フラグは Unicode フラグです。 u フラグを用いることでマルチバイトの Unicode 文字を正しく扱うことができます。
const s = 'Lol! \u{1f923}'
console.log(s)
console.log(/\u{1f923}/.test(s)) // false
console.log(/\u{1f923}/u.test(s)) // true
y スティッキーフラグ
JavaScript 正規表現の y フラグはスティッキー (sticky) フラグです。
y フラグをセットすると、 RegExp オブジェクトの sticky プロパティが true になります。 このとき test() メソッドや exec() メソッドの呼び出しが成功 (マッチ) した場合、 lastIndex プロパティがマッチした箇所の最後にセットされ、次回のメソッド呼び出し時には lastIndex を開始地点とし、 その位置からマッチするかチェックします。
マッチしない場合は lastIndex は 0 にリセットされます。
const r = /foo/y
const s = 'foofooXXXfoo'
console.log(`1: lastIndex=${r.lastIndex} sticky=${r.sticky}`)
console.log(r.test(s))
console.log(`2: lastIndex=${r.lastIndex} sticky=${r.sticky}`)
console.log(r.test(s))
console.log(`3: lastIndex=${r.lastIndex} sticky=${r.sticky}`)
console.log(r.test(s))
console.log(`4: lastIndex=${r.lastIndex} sticky=${r.sticky}`)
console.log(r.test(s))
// 1: lastIndex=0 sticky=true
// true
// 2: lastIndex=3 sticky=true
// true
// 3: lastIndex=6 sticky=true
// false
// 4: lastIndex=0 sticky=true
// true
スティッキーなパターンマッチの時は、暗黙的に ^ を指定したのと同様の動作になる点に注意が必要です。
const r = /bar/y
const s = 'foobar'
console.log(r.test(s)) // false