uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Groovy 1.6.1以降で利用可能になった新しい正規表現処理用メソッド。

http://sjtai.blogspot.com/2009/04/new-find-and-findall-methods-for-string.html

より。

 if ("abc" =~ /a../) {
     ..
 }

if ("abc".find(/a../) ) {
     ・・
}

などとかけるます。ちなみに上の両者のセマンティクスは厳密には違います。前者は最終的にMatcher#findが呼ばれ結果はbooleanなのに対して、後者はfind()メソッドの結果、つまりマッチすればその文字列、マッチしなければnullが返るというものです。*1

以下、使用例:

assert "abca".find(/a/) == 'a'
assert "abca".find(/x/) == null
assert "abca".findAll(/a/) == ['a', 'a']
assert "abca".findAll(/x/) == []

"abcdef".find(/(.)/){m0,m1->println m1 }
a

"abcdef".findAll(/(.)/){m0,m1->println m1 }
a
b
c
d
e
f

こんなかんじです。
"=~や=~="を覚えなくても良くなった!!!

ということか。まあ、確かにこれらの演算子は分かりにくいし覚えにくいともいえるからな。

*1:一瞬期待したのですが、=~に対するオペレーターオーバーローディングが、findメソッドの再定義によって実現されるようになったという訳ではない。=~,=~=は依然としてオーバーローディング可能な演算子ではない(と思う。ソースを見て確認しないとわからないけど)。