レッスン 3
フラグとマッチモード
Global、大文字小文字無視、multiline、dotAll、Unicode マッチ。
フラグは文字の意味ではなく、エンジンが 入力をどうスキャンするか を変えます。JavaScript ではフラグは閉じ / の後、または new RegExp(pattern, flags) の第 2 引数に現れます。
一般的なフラグ(JavaScript)
| フラグ | 名前 | 効果 |
|---|---|---|
g | global | 最初だけでなくすべてのマッチを検索 |
i | ignore case | A が a にマッチ |
m | multiline | ^ と $ が文字列端だけでなく行境界にマッチ |
s | dotAll | . が改行にマッチ |
u | Unicode | Unicode 対応 \u{...} と一部プロパティエスケープ |
y | sticky | lastIndex でのみマッチ(高度な反復) |
他言語も同様のスイッチ(re.IGNORECASE、(?i) など)を少し異なる名前で提供します。
Global マッチが重要
g なしでは String.prototype.match と多くの exec ループは最初のヒットで止まります。ログパーサーとハイライトツールはほぼ常に global モード—または明示的な反復—が必要です。
ステートフル regex オブジェクト に注意: global な RegExp は lastIndex を更新します。無関係な文字列間で 1 インスタンスを再利用すると、lastIndex をリセットしない限りマッチをスキップできます。
Multiline ログファイル
ログファイルは多くの行を含みます。m ありでは ^ERROR は 行頭 から ERROR で始まる行にマッチ—通常これが欲しい動作です。m なしでは ^ はしばしば blob 全体の先頭のみを意味します。
g と組み合わせて貼り付け内のすべてのエラー行を見つけます。
DotAll と貼り付け内容
ユーザー入力と JSON 文字列には \n が含まれることがあります。デフォルトでは . は行を跨ぎません;s(dotAll)で . がマッチ—過剰マッチのリスクを受け入れる場合 に「閉じタグまで任意」パターンに有用。
Unicode と国際化テキスト
ユーザー名、都市、slug に非 ASCII 文字が含まれることがあります。u フラグはサロゲートペアとモダン JavaScript の \p{...} プロパティクラスを正しく扱います。
Unicode 意識なしでは \w が国際化アプリで有効な文字を見逃すことがあります。
要点
パターンが「1 行では動くがファイルでは動かない」とき、まず フラグ を確認—特に g、m、s。その後アンカーと greediness を再確認してください。