Съвпадение на шаблони в струни в Groovy

1. Общ преглед

В тази статия ще разгледаме функциите на езика Groovy за съвпадение на шаблони в Strings.

Ще видим как подходът на Groovy, включен в батериите, ни осигурява мощен и ергономичен синтаксис за нашите основни нужди за съвпадение на шаблоните.

2. Оператор на шаблони

Езикът Groovy въвежда така наречения модел оператор ~ . Този оператор може да се счита за синтактичен пряк път към метода java.util.regex.Pattern.compile (низ) на Java .

Нека го проверим на практика като част от тест на 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 съдържа и оператора на съвпадение == ~ .

Той връща булева стойност и изпълнява строго съответствие с посочения регулярен израз. По принцип това е синтактичен пряк път за извикване на Pattern.matches (регулярно изражение, низ) .

Отново ще го разгледаме на практика като част от тест на Spock :

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's ~.

Тук виждаме оператора в действие:

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.