Groovy3 Tips takeBetweenで囲われた文字列を抽出

まえがき

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. で動作確認しています。

コメントを残す