Correspondência de padrões em seqüências de caracteres no Groovy
1. Visão geral
Neste artigo, veremos os recursos da linguagem Groovy para correspondência de padrões em Strings.
Veremos como a abordagem de baterias incluídas do Groovy nos fornece uma sintaxe poderosa e ergonômica para nossas necessidades básicas de correspondência de padrões.
2. Operador Padrão
A linguagem Groovy introduz o chamado operador de padrão~. Este operador pode ser considerado um atalho sintático para o métodojava.util.regex.Pattern.compile(string) do Java.
Vamos dar uma olhada na prática como parte de um testeSpock:
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()
}
Isso também é muito conveniente, mas veremos que esse operador é apenas a linha de base para alguns outros operadores ainda mais úteis.
3. Operador de correspondência
Na maioria das vezes, e especialmente ao escrever testes, não estamos realmente interessados em criar objetosPattern, mas em vez disso, queremos verificar se aString corresponde a uma determinada expressão regular (ouPattern). Groovy, portanto, também contém o operador de correspondência==~.
Ele retornabooleane executa uma correspondência estrita com a expressão regular especificada. Basicamente, é um atalho sintático ao invés de chamarPattern.matches(regex, string).
Mais uma vez, examinaremos isso na prática como parte de um testeSpock:
def "match operator example"() {
expect:
'foobar' ==~ /.*oba.*/
and: "matching is strict"
!('foobar' ==~ /foo/)
}
4. Localizar Operador
O último operador Groovy no contexto de correspondência de padrões é o operador find~=. Nesse caso, o operador criará e retornará diretamente uma instânciajava.util.regex.Matcher.
Podemos agir sobre essa instânciaMatcher, é claro, acessando seus métodos Java API conhecidos. Além disso, também podemos acessar grupos correspondentes usando uma matriz multidimensional.
E isso não é tudo - a instânciaMatcher forçará automaticamente para um tipoboolean chamando seu métodofind() se usado como um predicado. Citando os documentos oficiais do Groovy, isso significa que "o operador = ~ é consistente com o uso simples do operador = ~ do Perl".
Aqui, vemos o operador em ação:
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. Conclusão
Vimos como a linguagem Groovy nos dá acesso aos recursos Java integrados em relação às expressões regulares de uma maneira muito conveniente.
Oofficial Groovy documentation também contém alguns exemplos concisos sobre este tópico. É especialmente legal se você considerar que os exemplos de código nos documentos são executados como parte da construção da documentação.
Como sempre, exemplos de código podem ser encontrados emGitHub.