Regex ハンドブック:実際に使い回すパターン
正規表現は検索言語全体を1行に詰め込んだものであり、各パーツの仕組みが腑に落ちるまでは不可解に感じられる。このハンドブックでは、実務の8割を片付ける2割の構文だけを扱う。貼り付けたテキストからのメール抽出、入力検証、ログ分割、ファイル名の一括書き換えが対象である。
1. リテラル、ドット、文字クラス
大半の文字は自身にマッチし、ドットは改行以外の任意の1文字にマッチする。角括弧は集合を定義する。[0-9] は任意の数字、[^0-9] は数字以外の任意の文字にマッチする。\d、\w、\s といった省略形は数字、単語文字、空白をカバーする。何が来るべきか分かっている位置では、素のドットより明示的なクラスを選ぶべきである。
2. アンカーと量指定子
^ は先頭、$ は末尾に固定する。よって ^hi は hi で始まる文字列にのみマッチする。+ は1回以上、* は0回以上、? は省略可能を表す。これらの直後に ? を付けると遅延マッチに切り替わり、最後ではなく最初の機会で停止する。欲張りと遅延の違いは、予想外のマッチの最大の原因である。
3. グループ、交替とルックアラウンド
丸括弧はグループ化とキャプチャを行う。(cat|dog)s? は cat、cats、dog、dogs のいずれかにマッチする。(?:…) はキャプチャなしでグループ化する。\d+(?=px) のような先読みは後続を消費せずに検査するため、接尾辞を要求しつつ次のマッチのためにその場に残せる。名前付きグループは次にパターンを読む人のために意図を文書化する。
4. フラグがすべてを変える
閉じスラッシュの後の文字がエンジンを調整する。g は最初ではなく全マッチを取得し、i は大文字小文字を無視し、m はアンカーを行単位で動作させ、s はドットを改行越えさせ、u は完全な Unicode を有効化し、y はマッチを1位置に固定する。正しく見えるパターンが何も返さない場合、フラグの組み合わせが原因であることが多い。
5. バックトラックの罠
(a+)+ のような入れ子の量指定子に長い非マッチ文字列を与えると、エンジンは指数関数的な数の経路をたどりタブがフリーズする。繰り返しは平坦に保ち、対応環境では占有的な書き換えやアトミックグループを選び、出荷前に敵対的な入力で疑わしいパターンをテストすべきである。our regex tester に貼り付ければ、すべてのマッチとグループがブラウザ上でライブにハイライトされる。