複数行にまたがってパターン検索したい時は、「マルチラインモード」じゃなくて「シングルラインモード」で検索するもんだと今頃気がついた水曜日の夜。


どうもご無沙汰してます。にしふなです。

正規表現で、デリミタ(/)の後にiだかgだとか入れて、いろんなことができて幸せになれる機能があるじゃないですか。
その機能の中に、複数行にまたがってパターンをマッチさせるか否か、と言う機能があるじゃないですか。ありますよね。
俺はそれを、単一行マッチを「シングルラインモード」、複数行マッチを「マルチラインモード」だと思ってたんですね。
でも実際は、複数行マッチさせたい場合はシングルラインモードを使うみたいなんですね。

なぜなら、「マルチ」、「シングル」は、「検索される側の文字列」(php風にいえば$subject)を、一行として扱うか、それとも複数行として扱うか、と言う違いを切り替える言葉なんですね。

例えば、下記のように人が見やすいように改行・インデントが加えられたソースコードがあったとします。

このようなソースコードに「シングルラインモード」を適用すると、以下のように扱われるみたいです。

つまり、改行・インデントといった、整形に関わる記号をすべて「通常の文字」として扱い、「検索される側の文字列」を1行としてみなすモードが「シングルラインモード」と言うことみたいなんですね。
と言うことは、正規表現の挙動はどちらのモードでも変わってないということになりますね。シングルでもマルチでも、1行分しかパターンを適用していないです。

とりあえず結論は、複数行にまたがって検索したい時は「シングルラインモード」で検索しろ!ってことですね。
ちなみに俺は、このことに気づくまで1時間ぐらいウンウン唸ってました。なんというかお恥ずかしい……(;ω;`)

でもですね、言い訳じみた感じになってしまって恐縮ですが、Web上で正規表現のチェックが出来る「PHP正規表現チェッカー」さんでは、複数行にまたがってパターン検索するときには「マルチラインモード(m)」にチェックを入れるんですよ!! これはかなり混乱してしまいました……まじどっちなんだよとorz
でも、このツール自体はかなり便利なので、気にせず使っていくと思いますけどね。
http://www.rider-n.sakura.ne.jp/regexp/regexp.php

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です