1. 概要

この記事では、文字列でのパターンマッチングのためのGroovy言語機能について説明します。

Groovyのバッテリーを含むアプローチが、基本的なパターンマッチングのニーズに対応する強力で人間工学的な構文をどのように提供するかを見ていきます。

2. パターン演算子

Groovy言語では、いわゆるパターン演算子が導入されています。 この演算子は、Javaの java .util.regex.Pattern.compile(string)メソッドへのシンタックスシュガーショートカットと見なすことができます。

スポックテストの一部として実際にチェックしてみましょう。

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 が特定の正規表現(またはパターン)。 したがって、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機能に非常に便利な方法でアクセスできるようになります。

公式のGroovyドキュメントにも、このトピックに関する簡潔な例がいくつか含まれています。 ドキュメントのコード例がドキュメントビルドの一部として実行されていることを考えると、特に便利です。

いつものように、コード例はGitHubにあります。