まえがき
Groovy3が正式リリースされたのが、2020年の2月ごろですが、
そろそろ、既存のコードをGroovy3に移行しようと思っています。
大きな変更点としては、
-
Javaのラムダ式がそのままGroovyでも書けるようになった。
(今までクロージャに書き換えなくてはいけなかった) -
メソッド参照もJavaスタイルのまま書けるようになりました。
-
Javaスタイルの
new int[] {1,2,3}
などがそのまま書けるようになった。
([1,2,3] as int[]
などとする必要があった) -
いくつかの演算子が追加になっている
などなど、書き出すと色々あるんですが・・。
Javaのコードがそのまま動くという旨味がなくなってたのが、またGroovy3によって復活した感じですね。
で、今回は新たに追加になった
StringGroovyMethods#takeBetweenというメソッドを一つ紹介したいと思います。
StringクラスにGroovyが自動で拡張しているメソッドになります。
takeBetween
特定の文字で囲われた文字列(enclosed string)を抽出するのに使えます。
String str = "Hello Groovy3!"
// "Hello " と "!" に囲まれた文字列を返す
assert "Groovy3" == str.takeBetween("Hello ", "!")
// from, to の代わりに単一の文字列を指定してもOK
// "o" に囲まれた文字列を返す
assert " Gr" == str.takeBetween("o")
もちろん、"
や '
で、囲われた文字列を抽出するのにも利用できます。
最後の引数にインデックスを渡すことで、何番目にヒットする文字列かを指定することができます。
String str = "'hoge' 'piyo' 'foo'"
// " に囲まれた文字列を返す
assert "hoge" == str.takeBetween("'")
// インデックスで、いくつ目の文字列を取得するか指定できる。
assert "hoge" == str.takeBetween("'", 0)
assert "piyo" == str.takeBetween("'", 1)
assert "foo" == str.takeBetween("'", 2)
残念なことに、ネストしたような場合には対応できないので、ご注意ください。
文字列を先頭から見ていって、最初に見つかった囲い文字列を抽出してるだけのようです。
String str = "900 = (3 * (1 + 2)) * 100"
// "3 * (1 + 2)" を期待しても入れ子関係までは判定できない。
assert "3 * (1 + 2" == str.takeBetween('(', ')', 0)
// "1 + 2" を期待しても入れ子関係までは判定できない。
assert "" == str.takeBetween('(', ')', 1)
※takeBetweenは、該当文字列がなかった場合、空文字列(""
)を返します。
takeAfter / takeBefore
あと、takeAfter/takeBefore というメソッドも追加されているので、軽く触れておきます。
String str = "Hello Groovy3!"
// " " の前の文字列を取得
assert "Hello" == str.takeBefore(" ")
// " " の後ろの文字列を取得
assert "Groovy3!" == str.takeAfter(" ")
指定文字の前か、後ろを抽出するためのメソッドですね。
※今回のコードは、Groovy 3.0.5. で動作確認しています。