Regex é um acrônimo para Regular Expression (Expressão regular). Que também é conhecida por: Regexp, RE, ER.
Para quem nunca leu o famoso Guia de Expressões regulares (Um livro, porém disponível on-line) do Aurélio (verde), clique aqui e confira!
As questões abaixo foram respondidas segundo a sintaxe utilizada no PHP da expressão regular compatível com Perl. (PCRE)
1. O PHP aceita expressões regulares compatíveis com Perl?
Sim. Mas há uma série de diferenças. Tais diferenças estão listadas na página: http://br.php.net/manual/pt_BR/reference.pcre.pattern.syntax.php
2. É possível indentar e colocar comentários em uma expressão regular?
Sim, é possível. As expressões regulares no PHP compatíveis com Perl herdaram alguns modificadores.
Um deles é exatamente para isso, para permitir espaços e comentários dentro da expressão.
Exemplo:
String: “(21) 0000-0000″
String: “21 0000-0000″
ER:
/^
(()?d{2}(?(1))) # Código de area
x20? # Espaço
d{4} - d{4} # Número do telefone
$/x
>> Casa!
Como os espaços e são ignorados e o sustenido (#, também conhecido como jogo da velha, etc) interpretado como comentários como vemos em algumas linhas de programação (Exemplos: PHP e Perl), você deverá adicionar escape no espaço (que é estranho) e no sustenido para serem aceitos com a representação real. Ou também pode usar através de \xCODE, onde CODE é o valor hexadecimal do código ASCII do caracter. Como foi feito no exemplo acima.
Outra maneira de colocar comentários é usando (?#pattern).
Exemplo:
String: “Idade: 10″
ER: /^Idade: (?#No máximo 3 dígitos)\d{1,3}$/
>> Casa!
3. Há como nomear um grupo?
Sim, a sintaxe é a seguinte: (?P<nome-do-grupo>expressão), sendo assim, cria-se outra forma de indicar o que casou neste grupo.
Ou seja, você pode tanto usar \N (a forma tradicional) como (?P=nome-do-grupo).
Vale lembrar que o retrovisor indica o valor que casou em um grupo, não a expressão contida em um grupo.
Para indicar a expressão de um grupo, você verá na próxima questão.
4. Há alguma espécie de retrovisor para a expressão de um grupo e não para o que casou em um grupo?
Sim, você poderá indicar da seguinte forma: (?N), onde N é o número do grupo.
Caso você tenha nomeado o grupo, você devera usar (?P>nome-do-grupo).
Exemplo:
String: “Supermercado e Hipermercado”
ER: /(Super|Hiper)mercado e \1mercado/
>> Não casa!
ER: /(Super|Hiper)mercado e (?1)mercado/
>> Casa!
ER: /(?P<tipo>Super|Hiper)mercado e (?P>tipo)mercado/
>> Casa!
5. Como verificar se determinado grupo opcional casou?
Para verificar se N grupo casou, você pode usar usar a estrutura (?(condicao)true|false) da seguinte forma: (?(1)true|false).
Onde 1 é o número do grupo. Como foi demonstrado na resposta da questão nº 2. (Note que deixei somente a parte `true`)
Exemplo:
String: “11″
String: “(11)”
ER: /(\()?\d+(?(1)\))/
>> Casa!
6. Há como fazer uma expressão regular recursiva?
Sim, é possível! Basta você usa o (?R) para indicar onde deverá ser reaplicada toda a expressão. Para não ser reaplicada infinitamente tentando casar algo, você deverá usar um quantificador que envolva o caso da não ocorrência. Por exemplo: * (asterisco).
Exemplo:
String: “(foo(bar))”
ER: /\((\w+)(?R)*\)/
>> Casa!
7. Além do escape, algo mais tira o efeito de metacaracteres?
Sim. Para tirar o efeito de um ou vários metacaracteres você pode utilizar \Q … \E. Tirando o efeito, tentará casar literalmente.
Exemplo:
String: “.+”
ER: /\Q.*\E/
>> Não casa!
ER: /.*/
>> Casa!