Pattern Matching in Strings in Groovy

1. Übersicht

In diesem Artikel werden die Groovy-Sprachfunktionen für den Mustervergleich in Strings beschrieben.

Wir werden sehen, wie Groovys Ansatz mit Batterien eine leistungsstarke und ergonomische Syntax für unsere grundlegenden Anforderungen an die Mustererkennung bietet.

2. Musteroperator

Die Sprache Groovy führt den sogenannten Musteroperator ~ ein . Dieser Operator kann als syntaktische Zuckerverknüpfung zur Java- Methode java.util.regex.Pattern.compile (string) betrachtet werden.

Lassen Sie es uns in der Praxis als Teil eines Spock- Tests überprüfen:

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() }

Dies ist auch ziemlich praktisch, aber wir werden sehen, dass dieser Operator lediglich die Basis für einige andere, noch nützlichere Operatoren ist.

3. Operator abgleichen

Die meiste Zeit und insbesondere beim Schreiben von Tests sind wir nicht wirklich daran interessiert, Musterobjekte zu erstellen , sondern möchten stattdessen überprüfen, ob ein String mit einem bestimmten regulären Ausdruck (oder Muster ) übereinstimmt . Groovy enthält daher auch den Match-Operator == ~ .

Es gibt einen Booleschen Wert zurück und führt eine strikte Übereinstimmung mit dem angegebenen regulären Ausdruck durch. Grundsätzlich ist es eine syntaktische Verknüpfung zum Aufrufen von Pattern.matches (Regex, String) .

Auch hier werden wir uns im Rahmen eines Spock- Tests in der Praxis damit befassen :

def "match operator example"() { expect: 'foobar' ==~ /.*oba.*/ and: "matching is strict" !('foobar' ==~ /foo/) }

4. Suchen Sie den Operator

Der letzte Groovy-Operator im Kontext des Mustervergleichs ist der Suchoperator ~ = . In diesem Fall erstellt der Operator direkt eine java.util.regex.Matcher- Instanz und gibt sie zurück.

Wir können auf diese Matcher- Instanz natürlich reagieren , indem wir auf die bekannten Java-API-Methoden zugreifen. Darüber hinaus können wir aber auch über ein mehrdimensionales Array auf übereinstimmende Gruppen zugreifen.

Und das ist noch nicht alles - die Matcher- Instanz wird automatisch zu einem booleschen Typ gezwungen, indem sie ihre find () -Methode aufruft , wenn sie als Prädikat verwendet wird. Unter Angabe der offiziellen Groovy-Dokumente bedeutet dies, dass der Operator = ~ mit der einfachen Verwendung des Operators = ~ von Perl übereinstimmt.

Hier sehen wir den Operator in Aktion:

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. Schlussfolgerung

Wir haben gesehen, wie wir mit der Groovy-Sprache auf sehr bequeme Weise auf die integrierten Java-Funktionen für reguläre Ausdrücke zugreifen können.

Die offizielle Groovy-Dokumentation enthält auch einige kurze Beispiele zu diesem Thema. Es ist besonders cool, wenn Sie bedenken, dass die Codebeispiele in den Dokumenten als Teil der Dokumentationserstellung ausgeführt werden.

Codebeispiele finden Sie wie immer auf GitHub.