Expressões Regulares I - o básico
Tags: regex, beginners, expressoesregulares, pcre
Published: 2022-08-30 01:46:34

`\d{3}\.?\d{3}\.?\d{3}-?\d{2}`

Não, seu navegador não está com problemas de encoding e nem aconteceu do meu gato deitar no meu teclado. Esse monte de caracteres que parecem jogados aleatoriamente é um exemplo de **expressão regular**.
Expressões regulares, que a partir desse ponto serão chamadas de **regexes** (singular, **regex**) são conjuntos de caracteres que descrevem um padrão que será buscado num texto. Um exemplo vai deixar mais claro.

Considere o seguinte texto:

> A história de toda a sociedade até aqui é a história de lutas de classes.

Se você quiser extrair a palavra `classes` desse texto você pode usar a seguinte regex.

`classes`

Okay, não é muito útil, mas regexes podem fazer mais que isso. Pegue o exemplo a seguir:

> Guerra Austríaco-Prusiana de 1866. O problema desta guerra foi discutido nas reuniões do Conselho Geral da Internacional Operária, celebrada nos dias 19 e 26 de junho, e 17 de julho de 1866 de julho. [Nota do MIA].

Se você quiser extrair todos os números desse texto você pode usar a seguinte regex.

`\d+`

Descrevendo o que está acontecendo:
* `\d` descreve um dígito (0, 1, 2, ..., 9)
* `+` descreve que o símbolo anterior pode aparecer 1 ou mais vezes.

Dessa maneira, qualquer grupo de dígitos será encontrado. No caso do texto anterior, as seguintes informações serão encontradas:
* 1866
* 19
* 26
* 17
* 1866

Com esse segundo exemplo podemos ver um pouco melhor pra que servem regexes. Agora que passamos por isso, vamos começar do começo.

## O começo
Nesse primeiro artigo vamos falar sobre _caracteres literais_, _caracteres especiais_ e _quantificadores_.

### Caracteres Literais
Como descrevemos acima, caracteres literais são caracteres que são encontrados literalmente. Então se houver qualquer caracter literal na regex, ele será procurado literalmente.
E quais são esses caracteres literais? Bom, são todos os caracteres que não são especiais. Vamos a eles, então?

### Caracteres Especiais
Os caracteres especiais são caracteres que tem algum uso especial, como representar repetição, caracter opcional ou outras coisas.
O primeiro caracter especial que discutiremos é o caracter `\`, chamado comumente de **contra-barra**. Esse caracter faz com que o próximo caracter passe a ser especial se for literal e literal se for especial. Vejamos alguns exemplos:
* `\d` => `d` é um caracter literal, mas precedido de `\`, passa a significar qualquer dígito
* `\+` => `+` é um caracter especial, mas precedido de `\` (também chamado de "escapado"), passa a significar `+` literalmente.

Outros caracteres especiais são `.`, que representa qualquer caracter (exceto quebra de linha), `?`, que diz que o símbolo anterior é opcional, entre outros. Para uma lista mais completa dos caracteres especiais mais comuns nas engines de regex, [clique aqui](https://www.regular-expressions.info/refcharacters.html).

### Quantificadores
Quantificadores são úteis para evitar repetições na regex. Por exemplo:

* `\d{4}` é o mesmo que `\d\d\d\d`

Há alguns tipos de quantificadores. Eles são:
* `*` significa que o símbolo anterior pode repetir 0 ou mais vezes (ou seja, `ab*` identifica tanto `a` quando `ab`, `abb`, `abbbb`, etc...)
* `+` significa que o símbolo anterior pode repetir 1 ou mais vezes (ou seja, `ab+` identifica tanto `ab`, `abb`, `abbbb`, etc..., mas não `a`)
* {a,} significa que o símbolo anterior pode repetir **a** ou mais vezes
* {,a} significa que o símbolo anterior pode repetir de 0 a **a** vezes
* {a,b} significa que o símbolo anterior pode repetir de **a** a **b** vezes
* `?` significa que o símbolo anterior pode ocorrer 0 ou 1 vez

### A regex do começo
Agora você deve ser capaz de entender a regex do começo.

`\d{3}\.?\d{3}\.?\d{3}-?\d{2}`

* `\d{3}` => 3 dígitos
* `\.?` => um caracter `.` opcional
* `-?` => um caracter `-` opcional
* `\d{2}` => 2 dígitos

Dessa forma, essa regex identifica números com formato igual ao de CPFs num texto (validação não é feita nesse caso.)

## Conclusão
Expressões regulares são uma ferramenta muito útil para processamento de textos, tanto para validação quanto para busca de informações. Apesar de ser recomendada cautela em seu uso pois o processamento de expressões regulares pode ser bastante complexo, no sentido computacional do termo, devido a uma estratégia chamada de _backtracking_, sobre a qual falaremos numa parte futura, regex é uma das ferramentas fundamentais no cinto de utilidades do profissional de tecnologia.

Nos vemos na próxima parte.