Regular Expressions
#
// Go oferece suporte nativo para [expressões regulares](https://pt.wikipedia.org/wiki/Express%C3%A3o_regular).
// Aqui estão alguns exemplos comuns de tarefas
// relacionadas a regEx em Go
package main
import (
"bytes"
"fmt"
"regexp"
)
func main() {
// Aqui é testado se um padrão corresponde a uma string.
match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
fmt.Println(match)
// Acima foi usado o padrão de string diretamente, mas
// para outras tarefas de regEx, é necessário compilar
// uma struct otimizada `Regexp` struct.
r, _ := regexp.Compile("p([a-z]+)ch")
// Muitos métodos estão disponíveis nestas structs.
// Aqui está uma verificação de correspondência,
// como a que vimos antes.
fmt.Println(r.MatchString("peach"))
// Isto encontra a correspondência para o regexp.
fmt.Println(r.FindString("peach punch"))
// Isto também encontra a primeira correspondência mas
// retorna os índices de início e final ao invés do texto.
fmt.Println("idx:", r.FindStringIndex("peach punch"))
// A variante `Submatch` inclui informação sobre
// a correspondência e subcorrespondências dentro
// das correspondências. Por exemplo, isto retornará
// informação para ambos `p([a-z]+)ch` e `([a-z]+)`.
fmt.Println(r.FindStringSubmatch("peach punch"))
// Similarmente esta forma retorna informação sobre os
// índices das correspondências e subcorrespondências.
fmt.Println(r.FindStringSubmatchIndex("peach punch"))
// A variante `All` destas funções aplicam para todas
// as correspondências de determinado input, não apenas
// a primeira.
fmt.Println(r.FindAllString("peach punch pinch", -1))
// Estas variantes `All`também estão disponíveis para
// outras funções vistas anteriormente.
fmt.Println("all:", r.FindAllStringSubmatchIndex(
"peach punch pinch", -1))
// Fornecer um inteiro não-negativo como segundo argumento
// para estas funções limitará o número de correspondências.
fmt.Println(r.FindAllString("peach punch pinch", 2))
// Nos exemplos acima, foram passados argumentos do tipo
// string e utilizados funções com string no nome, como
// `MatchString`. Também é possível utilizar as versões
// que aceitam `[]byte` como argumentos, deixando de usar
// o `String` no nome da função.
fmt.Println(r.Match([]byte("peach")))
// Ao criar variáveis globais com expressões regulares,
// é permitido usar a variação `MustCompile` do `Compile`.
// `MustCompile` gera panico ao invés de retornar um erro,
// o que torna a utilização de variáveis globais mais segura.
r = regexp.MustCompile("p([a-z]+)ch")
fmt.Println("regexp:", r)
// O pacote `regexp` também pode ser usado para substituir
// trechos de strings com outros valores.
fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))
// A variante `Func` permite transformar o texto correspondente
// com determinada função.
in := []byte("a peach")
out := r.ReplaceAllFunc(in, bytes.ToUpper)
fmt.Println(string(out))
}
$ go run regular-expressions.go
true
true
peach
idx: [0 5]
[peach ea]
[0 5 1 3]
[peach punch pinch]
all: [[0 5 1 3] [6 11 7 9] [12 17 13 15]]
[peach punch]
true
regexp: p([a-z]+)ch
a <fruit>
a PEACH
# Para uma referência completa de expressões regulares
# em go, acesse a página da documentação do
# [`regexp`](https://pkg.go.dev/regexp).