正規表現が文字列の先頭・末尾にマッチするか調べる
Javaの正規表現ではRubyと同じく文字列先頭を「\A」、文字列末尾を「\z」
(小文字のzであることに注意)で表現できます。
それを確認するつもりが確認できなかった。。。。
ソースと結果
文字列先頭が「a」
(~/\Aa/).matcher("aiueo").find() ===> true
文字列先頭が「o」
(~/\Ao/).matcher("aiueo").find() ===> false
文字列先頭が「あ」
(~/\Aあ/).matcher("あいうえお").find() ===> true
文字列末尾が「o」
(~/o\z/).matcher("aiueo").find() ===> true
文字列末尾が「a」
(~/a\z/).matcher("aiueo").find() ===> false
文字列末尾が「あ」
(~/あ\z/).matcher("あいうえお").find() ===> false
「^」「\A」「$」「\z」「\Z」の違い
行頭 「^」
m1 = (~/^d./).matcher("abc\ndefg\nhi\n") m1.find() m1[0] ===> java.util.regex.Matcher[pattern=^d. region=0,12 lastmatch=] ===> false ERROR java.lang.IndexOutOfBoundsException: index is out of range 0..-1 (index = 0) at groovysh_evaluate.run (groovysh_evaluate:2) ...
"abc\ndefg\nhi\n".find(~/^d./) ===> null
文字列先頭「\A」
m2 = (~/\Ad./).matcher("abc\ndefg\nhi\n") m2.find() m2[0] ===> java.util.regex.Matcher[pattern=\Ad. region=0,12 lastmatch=] ===> false ERROR java.lang.IndexOutOfBoundsException: index is out of range 0..-1 (index = 0) at groovysh_evaluate.run (groovysh_evaluate:2) ...
"abc\ndefg\nhi\n".find(~/\Ad./) ===> null
行末「$」
m3 = (~/..$/).matcher("abc\ndefg\nhi\n") m3.find() m3[0] ===> java.util.regex.Matcher[pattern=..$ region=0,12 lastmatch=] ===> true ===> hi
"abc\ndefg\nhi\n".find(~/..$/) ===> hi
文字列末尾「\z」
m4 = (~/..\z/).matcher("abc\ndefg\nhi\n") m4.find() m4[0] ===> java.util.regex.Matcher[pattern=..\z region=0,12 lastmatch=] ===> false groovy:000> m4[0] ERROR java.lang.IndexOutOfBoundsException: index is out of range 0..-1 (index = 0) at groovysh_evaluate.run (groovysh_evaluate:2) ...
"abc\ndefg\nhi\n".find(~/..\z/) ===> null
文字列中の最後の行末「\Z」
m5 = (~/..\Z/).matcher("abc\ndefg\nhi\n") m5.find() m5[0] ===> java.util.regex.Matcher[pattern=..\Z region=0,12 lastmatch=] ===> true ===> hi
"abc\ndefg\nhi\n".find(~/..\Z/) ===> hi
おかしいな。。。予想と違うな。
結果は以下のようになると思ったんだけど。
「^d.」は de
「\Ad.」は null
「..$」は bc
「..\z」は hi
「..\Z」はi\n
うーん、よくわからん。(>o<")
誰か教えて。
JavaDocには以下のように書いてあるな。
^ 行の先頭 $ 行の末尾 \A 入力の先頭 \Z 最後の行末記号がある場合は、それを除く入力の末尾 \z 入力の末尾
入力ってなんだろ。。。
疑問点
groovyとrubyの違いはなぜか?
メソッドが同等ではないのか?
groovy:000> "abc\ndefg\nhi\n".find(~/^d./) ===> null
irb(main):001:0> p "abc\ndefg\nhi\n".slice(/^d./) "de" => nil
実行環境
- OS:Windows XP
- Groovy Version: 1.6.5
- JVM: 1.6.0_12