Regular Expressions, RE, REGEX, Expressões Regulares, ER… ou aquelas letrinhas e símbolos dentro de colchetes e parênteses que não fazem o menor sentido, mas aparecem em diversos lugares quando estamos programando, seja em php, em javascript..

A maioria das linguagens de programação atuais possuem um interpretador de regex nativo. As Expressões Regulares são um conjunto de caracteres que fazem praticamente milagre quando se trata de encontrar, selecionar ou testar padrões de texto em um dado conteúdo.

Todos nós já precisamos usar ou já vimos em algum lugar coisas como:

var er = /^[a-zA-Z0-9][a-zA-Z0-9\._-]+@([a-zA-Z0-9\._-]+\.)[a-zA-Z-0-9]{2}/;

Porém, não é legal usarmos essas letrinhas mágicas sem realmente entender o que são.

Esta regex acima, por exemplo, eu uso para verificar se o usuário digitou um endereço de email corretamente.

Escrevendo a sua primeira regex

Vamos começar com algo bem básico:

<?php

$pattern = '/O rato roeu a roupa do rei de Roma/';
$subject = 'O rato roeu a roupa do rei de Roma';
preg_match( $pattern, $subject, $matches );

echo '<pre>';
var_dump( $matches );

A saída será:

array(1) {<br />
  [0]=><br />
  string(26) "O rato roeu a roupa do rei de Roma"<br />
}<br />

ou seja, casamos(encontramos) perfeitamente todo o padrão($pattern), dentro do conteúdo($subject). Óbvio, pois o meu pattern é exatamente igual ao meu subject.

Casando rato ou gato

Vou começar a “complicar” um pouquinho.. digamos que eu queira “casar”, tanto quanto for um rato, como quando for um gato a ter roido a tal roupa.

Agora a minha expressão regular, é assim:

$pattern = '/O (gato|rato) roeu a roupa do rei de Roma/';
O caracter pipe ”, representa o operador lógico OU.

Com essa er, consigo casar tanto o conteudo: O rato roeu a roupa do rei de Roma, quanto o conteúdo O gato roeu a roupa do rei de Roma.

(rato|gato)

Essas duas palavras são bem próximas uma da outra, a única diferença é a primeira letra.

Então podemos melhorar a nossa ER, para o seguinte:

$pattern = '/O (g|r)(ato) roeu a roupa do rei de Roma/';

O interpretador ao ler esta regex, faz o seguinte:

-> Case a frase que começar com uma letra O maiúscula;

-> Um espaço em branco;

-> Uma letra “g” ou uma letra “r”, seguida da string “ato”;

-> Um espaço em branco…

Continua casando, sem nenhuma perda:

array(3) {
[0]=>
string(26) “O rato roeu a roupa do rei de Roma”
[1]=>
string(1) “r”
[2]=>
string(3) “ato”
}

As posições 1 e 2 desse array, apareceram por causa dos grupos que usei na ER (aqueles trechos do $pattern que está dentro de parânteses), mas isso não é importante agora. Apenas note que continuo casando a mesma frase na posição 0 deste array.

roeu ou comeu

Não sei ao certo, se o nosso gato ou rato, comeu ou roeu a roupa do pobre coitado do rei.

Mas posso adequar a expressão regular para encontrar o meliante, de acordo com o crime dele, seguindo a mesma regra do OU que usei para casar rato ou gato.

$pattern = '/O (g|r)(ato) (roeu|comeu) a roupa do rei de Roma/';

Com esta modificação na ER, agora consigo casar as frases:

O rato roeu a roupa do rei de Roma;

O rato comeu a roupa do rei de Roma;

O gato roeu a roupa do rei de Roma;

O rato comeu a roupa do rei de Roma.

Aos poucos

Não tente logo de cara fazer a ER mais complexa do mundo. Comece do simples.

Vá entendendo aos poucos e melhorando a sua regex conforme for precisando.

<?php

$pattern = '/O (g|r)(ato) (r|c)om?eu a roupa d(o rei|a rainha) d(e Roma|a Belgica)/';
$subject = 'O rato roeu a roupa do rei de Roma';
preg_match( $pattern, $subject, $matches );

echo '<pre>';
var_dump( $matches );


$subject = 'O gato comeu a roupa da rainha da Belgica';
preg_match( $pattern, $subject, $matches );

echo '<pre>';
var_dump( $matches );

Ah, é… eu queria falar sobre a rainha da Belgica, mesmo sem saber se a Bélgica tem rainha..

Num próximo post sobre ER vou mostrar alguns casos de uso, e explicar a construção da expressão regular, passo a passo. Apartir do pensamento na necessidade.

Curtiu ? comente.