読者です 読者をやめる 読者になる 読者になる

正規表現が文字列の先頭・末尾にマッチするか調べる (マルチラインモード含む)

groovy

twitterid:uehajからコメントをもらったもう一度。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/regex/Pattern.html#MULTILINE

行末記号の説明

デフォルトでは、正規表現 ^ および $ は行末記号を無視し、入力シーケンス全体の
それぞれ先頭と末尾だけにマッチします。MULTILINE モードがアクティブになると、
^ は入力の先頭、および入力の末尾を除くすべての行末記号の後にマッチします。
MULTILINE モードの場合、$ は行末記号の直前、または入力シーケンスの末尾にマッチします。 

MULTILINEの説明

複数行モードを有効にします。
複数行モードでは、表現 ^ と $ は、それぞれ行末記号または入力シーケンスの
末尾の直後または直前にマッチします。デフォルトでは、これらの表現は入力
シーケンス全体の先頭と末尾にだけマッチします。
複数行モードは、埋め込みフラグ表現 (?m) を使用して有効にすることもできます。 

正規表現 . の説明

正規表現 . は、DOTALL フラグが指定されていない場合、行末記号以外のすべての
文字とマッチします。  

DOTALLの説明

DOTALL モードを有効にします。  
DOTALL モードでは、表現 . は行末記号を含む任意の文字にマッチします。
デフォルトでは、この表現は行末記号にマッチしません。  
DOTALL モードは、埋め込みフラグ表現 (?s) を使用して有効にすることもできます。

「^」「\A」「$」「\z」「\Z」の違い

行頭 「^」
groovy:000> "abc\ndefg\nhi\n".find(~/^d./)
===> null
groovy:000> "abc\ndefg\nhi\n".find(~/(?m)^d./)
===> de
文字列先頭「\A」
groovy:000> "abc\ndefg\nhi\n".find(~/\Ad./)
===> null
groovy:000> "abc\ndefg\nhi\n".find(~/(?m)\Ad./)
===> null
行末「$」
groovy:000> "abc\ndefg\nhi\n".find(~/..$/)
===> hi
groovy:000> "abc\ndefg\nhi\n".find(~/(?m)..$/)
===> bc
文字列末尾「\z」
groovy:000> "abc\ndefg\nhi\n".find(~/..\z/)
===> null
groovy:000> "abc\ndefg\nhi\n".find(~/(?m)..\z/)
===> null
groovy:000> "abc\ndefg\nhi\n".find(~/(?m)(?s)..\z/)
===> i
文字列中の最後の行末「\Z」
groovy:000> "abc\ndefg\nhi\n".find(~/..\Z/)
===> hi
groovy:000> "abc\ndefg\nhi\n".find(~/(?m)..\Z/)
===> hi
groovy:000> "abc\ndefg\nhi\n".find(~/(?m)(?s)..\Z/)
===> hi

実行環境