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

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 JavaScript 入門