Eclesiastes

Ícone

Sobre o que é este blog? O.o

Perguntas não freqüentes

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!

Arquivado em:PCRE, PHP

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: