Groovyの文字列のパターンマッチング

  • link:/category/programming/ [プログラミング]

  • Groovy

1. 概要

この記事では、文字列でのパターンマッチングのためのGroovy言語機能を見ていきます。
Groovyのバッテリーに組み込まれたアプローチにより、基本的なパターンマッチングのニーズに対応する強力で人間工学的な構文がどのように提供されるかがわかります。

2. パターン演算子

Groovy言語には、いわゆるパターン演算子_〜_が導入されています。 この演算子は、Java java.util.regex.Pattern.compile(string)_メソッドへの構文上の砂糖のショートカットと考えることができます。
_Spock_テストの一部として実際にチェックしてみましょう:
def "pattern operator example"() {
    given: "a pattern"
    def p = ~'foo'

    expect:
    p instanceof Pattern

    and: "you can use slashy strings to avoid escaping of blackslash"
    def digitPattern = ~/\d*/
    digitPattern.matcher('4711').matches()
}
これも非常に便利ですが、この演算子は他の、さらに便利な演算子の単なるベースラインであることがわかります。

3. 一致演算子

ほとんどの場合、特にテストの作成時には、_Pattern_オブジェクトの作成にはあまり関心がありませんが、代わりに、_String_が特定の正規表現(または_Pattern_)に一致するかどうかを確認する必要があります。 したがって、Groovyには一致演算子_ ==〜_も含まれています。
_boolean_を返し、指定された正規表現に対して完全一致を実行します。 基本的に、これは_Pattern.matches(regex、string)_を呼び出すことの構文上のショートカットです。
繰り返しになりますが、実際には_Spock_テストの一部として調査します。
def "match operator example"() {
    expect:
    'foobar' ==~ /.*oba.*/

    and: "matching is strict"
    !('foobar' ==~ /foo/)
}

4. 検索演算子

パターンマッチングのコンテキストにおける最後のGroovy演算子は、検索演算子_〜= _です。 この場合、オペレーターは_java.util.regex.Matcher_インスタンスを直接作成して返します。
もちろん、既知のJava APIメソッドにアクセスすることで、この_Matcher_インスタンスに基づいて行動できます。 しかし、さらに、多次元配列を使用して一致したグループにアクセスすることもできます。
それだけではありません— _Matcher_インスタンスは、述語として使用される場合、_find()_メソッドを呼び出すことにより、自動的に_boolean_型に強制されます。 公式のGroovyドキュメントを引用すると、これは「=〜演算子はPerlの=〜演算子の単純な使用と一致している」ことを意味します。
ここでは、演算子が動作していることがわかります。
def "find operator example"() {
    when: "using the find operator"
    def matcher = 'foo and bar, baz and buz' =~ /(\w+) and (\w+)/

    then: "will find groups"
    matcher.size() == 2

    and: "can access groups using array"
    matcher[0][0] == 'foo and bar'
    matcher[1][2] == 'buz'

    and: "you can use it as a predicate"
    'foobarbaz' =~ /bar/
}

5. 結論

Groovy言語を使用すると、正規表現に関する組み込みのJava機能に非常に便利な方法でアクセスできることがわかりました。
http://groovy-lang.org/operators.html#_pattern_operator[Groovyの公式ドキュメント]には、このトピックに関する簡潔な例も含まれています。 ドキュメントのコード例がドキュメントビルドの一部として実行されることを考慮すると、特にクールです。
いつものように、コード例はhttps://github.com/eugenp/tutorials/tree/master/core-groovy-2[GitHub]にあります。