Перейти к основному содержимому

Сопоставление с образцом в строках в Groovy

· 3 мин. чтения

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 определенному регулярному выражению (или Pattern ). Таким образом, Groovy также содержит оператор сопоставления ==~ .

Он возвращает логическое значение и выполняет строгое соответствие заданному регулярному выражению. По сути, это синтаксический ярлык для вызова Pattern.matches(regex, string) .

Опять же, мы рассмотрим это на практике в рамках теста Спока :

def "match operator example"() {
expect:
'foobar' ==~ /.*oba.*/

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

4. Найдите оператора

Последним оператором Groovy в контексте сопоставления с образцом является оператор поиска ~= . В этом случае оператор будет напрямую создавать и возвращать экземпляр java.util.regex.Matcher .

Конечно, мы можем воздействовать на этот экземпляр Matcher , обращаясь к его известным методам Java API. Но, кроме того, мы также можем получить доступ к соответствующим группам, используя многомерный массив.

И это еще не все — экземпляр Matcher автоматически приведет к логическому типу, вызвав свой метод find() , если он используется в качестве предиката. Цитируя официальную документацию 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 .