複数行での/./と/$/の扱い
以下の2点の各処理系での調査結果。
1.任意の1文字/./に改行は含まれるか?→"\n"=~/./でテスト。
2.行末/$/は途中の改行も含まれるか?→"1\n2"=~/1$/でテスト。
Perlの場合
テスト1 | テスト2 | |
マッチする | "\n"=~/./s | "1\n2"=~/1$/m |
マッチしない | "\n"=~/./ | "1\n2"=~/1$/ |
デフォルトでは/./にマッチしない。s修飾子を使うとマッチする。
デフォルトでは/1$/にマッチしない。m修飾子を使うとマッチする。
JavaScriptの場合
テスト1 | テスト2 | |
マッチする | "\n".match(/(?:\n|.)/) | "1\n2".match(/1$/m) |
マッチしない | "\n".match(/./) | "1\n2".match(/1$/) |
常に/./にマッチしない。マッチさせるには(?:\n|.)等を使う?
デフォルトでは/1$/にマッチしない。m修飾子を使うとマッチする。
Rubyの場合
テスト1 | テスト2 | |
マッチする | "\n"=~/./m | "1\n2"=~/1$/ |
マッチしない | "\n"=~/./ | "1\n2"=~/1\Z/ |
デフォルトでは/./にマッチしない。m修飾子を使うとマッチする。
常に/1$/にマッチする。なのでマッチさせたくないときは/\Z/を使う。
Perl,JavaScriptとはm修飾子の意味が違うので注意。
Gaucheの場合
テスト1 | テスト2 | |
マッチする | (#/./ "\n") | (#/1(?:\n|$)/ "1\n2") |
マッチしない | (#/[^\n]/ "\n") | (#/1$/ "1\n2") |
常に/./にマッチする。マッチさせたくないときは/[^\n]/等を使う?
常に/1$/にマッチしない。マッチさせるには(?:\n|$)等を使う?
指定出来るのはi修飾子のみでs修飾子,m修飾子はない。
Haskellの場合
テスト1 | テスト2 | |
マッチする | matchRegex (mkRegex ".") "\n" | matchRegex (mkRegexWithOpts "1$" True True) "1\n2" |
マッチしない | matchRegex (mkRegexWithOpts "." True True) "\n" | matchRegex (mkRegex "1$") "1\n2" |
デフォルトで/./にマッチする。マッチさせたくないときはmkRegexWithOptsの第1引数をTrueにする。
デフォルトでは/1$/にマッチしない。マッチさせるためにはmkRegexWithOptsの第1引数をTrueにする。
あれ?/./と/1$/を両方マッチさせる指定は出来ない?
ちなみに、mkRegexWithOptsの第2引数はi修飾子の逆の意味(Falseのときに大小文字の違いを無視する)
追記
正規表現修飾子の意味 修飾子 意味
http://www.kt.rim.or.jp/~kbk/regex/regex.html#OPT1
i 大小文字の違いを無視する
s シングルラインモードにする(.が改行にマッチする)
m マルチラインモードにする(^と$が改行の直前直後にマッチ)
x 拡張表記を許可する
なるほど、sはシングルラインモード、mはマルチラインモードの略だったのか。
やっぱりRubyのm修飾子の意味の方が逆な気がする…