正規表現が文字列の先頭・末尾にマッチするか調べる (マルチラインモード含む)
twitterとid: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
実行環境
- OS:Windows XP
- Groovy Version: 1.6.5
- JVM: 1.6.0_12