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

正規表現が文字列の先頭・末尾にマッチするか調べる

groovy

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

実行環境