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.