Dando continuidade a Série Go veremos: Expressões Regulares, além de ver como: Criar, Ler, Atualizar e Deletar arquivos com Go.
Go possui suporte nativo a expressões regulares através do pacote regexp
. Ele oferece funcionalidade para compilação, correspondência e manipulação de padrões regex.
Para usar RegEx em Go é necessário importar o pacote: "regexp"
. Vamos ver exemplos:
re
é uma string
e deve usar o método MatchString
.
Você precisa compilar a expressão regular com regexp.Compile
ou regexp.MustCompile
:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("RegEx")
if re.MatchString("Meu aprendizado de RegEx com Go") {
fmt.Println("Sim!")
}
}
Ou, se quiser capturar matched
:
package main
import (
"fmt"
"regexp"
)
func main(){
re := regexp.MustCompile("RegEx")
matched := re.MatchString("Meu aprendizado de RegEx com Go")
if matched {
fmt.Println("Sim!")
}
}
RegEx
por Expressões Regulares
:package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("RegEx")
texto := "Meu aprendizado de RegEx com Go"
resultado := re.ReplaceAllString(texto, "Expressões Regulares")
fmt.Println(resultado)
}
package main
import (
"fmt"
"regexp"
)
func main() {
html := "<h1>Título</h1>\n" +
"<p>Meu Parágrafo</p>\n" +
"<a href='https:\\meulink.com'>Meu Link</a>"
re := regexp.MustCompile("<[^>]*>")
limpo := re.ReplaceAllString(html, "")
fmt.Println(limpo)
}
DICA: Além de concatenar(+
) em múltiplas linhas uma string. Você também pode usar backticks(sinal de crase do Português):
Observação que se você não colar à esquerda, ele irá interpretar os espaços, exemplo:
html :=
`<h1>Título</h1>
<p>Meu Parágrafo</p>
<a href='https:\\meulink.com'>Meu Link</a>`
Métodos úteis:
regexp.Compile(
\regex)
- Compila uma regexre.FindString("abc123def")
- Retorna a primeira ocorrênciare.FindAllString("target1 target2 target3", -1)
- Retorna todas as ocorrênciasExemplos:
re := regexp.MustCompile(`\d+`)
fmt.Println(re.MatchString("abc123")) // true
fmt.Println(re.FindString("abc123def456")) // "123"
fmt.Println(re.FindAllString("a1 b22 c333", -1)) // ["1" "22" "333"]
fmt.Println(re.ReplaceAllString("abc123", "#")) // "abc#"
OBSERVAÇÕES:
regexp
de Go é baseado em RE2, sem suporte a backtracking nem lookaheads/lookbehinds.- Não há suporte direto a flags inline como
(?i)
. UseMustCompile
com prefixos como(?i)
para ignorar case.
CRUD é a sigla para: Create Read Update and Delete. Geralmente usado para bancos de dados, mas por questões didática vamos ver como: Criar/Inserir, Ler, Atualizar e Deletar dados em arquivos com Go.
package main
import (
"os"
)
func main() {
poema := `Ainda falta descobrir a serenidade
Ainda falta dominar a ansiedade
E aprender a esperar
Ainda me falta pacificar
Deixando o coração ficar mudo
Ainda falta aprender quase tudo
`
err := os.WriteFile("poema.txt", []byte(poema), 0644)
if err != nil {
panic(err)
}
}
ls poema.txt && cat poema.txt
package main
import (
"fmt"
"os"
)
func main() {
data, err := os.ReadFile("poema.txt")
if err != nil {
fmt.Println("Erro ao ler o arquivo:", err)
return
}
fmt.Print(string(data))
}
Inserir a palavra:
Meu Aprendizado:
package main
import (
"os"
)
func main() {
const prefixo = "Meu Aprendizado:\n"
const file = "poema.txt"
conteudo, err := os.ReadFile(file)
if err != nil {
panic(err)
}
novoConteudo := append([]byte(prefixo), conteudo...)
err = os.WriteFile(file, novoConteudo, 0644)
if err != nil {
panic(err)
}
}
Inserir a palavra:
---[ PAUSA ]---:
package main
import (
"os"
"strings"
)
func main() {
const insercao = "\n---[ PAUSA ]---\n"
const file = "poema.txt"
data, err := os.ReadFile(file)
if err != nil {
panic(err)
}
linhas := strings.Split(string(data), "\n")
if len(linhas) < 2 {
// Garante ao menos 2 quebras para chegar à linha 3
for len(linhas) < 2 {
linhas = append(linhas, "")
}
}
// Insere após a segunda linha (posição 2)
linhas = append(linhas[:2], append([]string{insercao}, linhas[2:]...)...)
conteudoFinal := strings.Join(linhas, "\n")
err = os.WriteFile(file, []byte(conteudoFinal), 0644)
if err != nil {
panic(err)
}
}
Inserir a palavra:
---[ FINAL ]---:
package main
import (
"os"
"strings"
)
func main() {
const insercao = "---[ FINAL ]---"
const file = "poema.txt"
data, err := os.ReadFile(file)
if err != nil {
panic(err)
}
linhas := strings.Split(string(data), "\n")
// Se terminar com linha vazia (quebra final), remova temporariamente
temQuebraFinal := false
if linhas[len(linhas)-1] == "" {
linhas = linhas[:len(linhas)-1]
temQuebraFinal = true
}
if len(linhas) == 0 {
linhas = []string{insercao}
} else {
// Use - 1 para inserir antes da última linha
//linhas = append(linhas[:len(linhas)-1], append([]string{insercao}, linhas[len(linhas)-1:]...)...)
// Insere na última linha:
linhas = append(linhas[:len(linhas)], append([]string{insercao}, linhas[len(linhas):]...)...)
}
resultado := strings.Join(linhas, "\n")
if temQuebraFinal {
resultado += "\n"
}
err = os.WriteFile(file, []byte(resultado), 0644)
if err != nil {
panic(err)
}
}
TEMPORARIO
:package main
import (
"os"
"strings"
)
func main() {
const file = "poema.txt"
const palavra = "TEMPORARIO"
data, err := os.ReadFile(file)
if err != nil {
panic(err)
}
linhas := strings.Split(string(data), "\n")
var resultado []string
for _, linha := range linhas {
if !strings.Contains(linha, palavra) {
resultado = append(resultado, linha)
}
}
final := strings.Join(resultado, "\n")
err = os.WriteFile(file, []byte(final), 0644)
if err != nil {
panic(err)
}
}
Linha 3, por exemplo:
package main
import (
"os"
"strings"
)
func main() {
const file = "poema.txt"
data, err := os.ReadFile(file)
if err != nil {
panic(err)
}
linhas := strings.Split(string(data), "\n")
if len(linhas) >= 3 {
linhas = append(linhas[:2], linhas[3:]...) // remove linha 3 (índice 2)
}
final := strings.Join(linhas, "\n")
err = os.WriteFile(file, []byte(final), 0644)
if err != nil {
panic(err)
}
}
package main
import (
"fmt"
"os"
)
func main() {
const file = "poema.txt"
err := os.Remove(file)
if err != nil {
//panic(err)
// Ou somente:
fmt.Println("O arquivo: '" + file + "' não existe.")
}
}
Até o próximo artigo da série!