Aprender expressões regulares [fechado]

Não entendo expressões regulares. Pode explicar - me de uma forma fácil de seguir? Se existem ferramentas online ou livros, Você também pode ligar a eles?

 166
Author: Teifion, 2008-08-07

1 answers

A parte mais importante são os conceitos. Uma vez que você entenda como os blocos de construção funcionam, as diferenças de sintaxe equivalem a pouco mais do que dialetos leves. Uma camada em cima da sintaxe do seu motor de expressão regular é a sintaxe da linguagem de programação que você está usando. Linguagens como Perl removem a maior parte desta complicação, mas você terá que ter em mente outras considerações se você estiver usando expressões regulares em um programa C.

Se pensares em expressões regulares como blocos de construção que você pode misturar e combinar como quiser, ele ajuda você a aprender a escrever e depurar seus próprios padrões, mas também como entender os padrões escritos por outros.

Começar simples

Conceptualmente, as expressões regulares mais simples são caracteres literais. O padrão {[[0]} corresponde ao carácter 'N'.

As expressões regulares ao lado umas das outras correspondem às sequências. Por exemplo, o padrão Nick corresponde à sequência ' N 'seguida de' i 'seguida de' c ' seguida de "k".

Se alguma vez usou grep no Unix-mesmo que só para procurar por cadeias de caracteres normais-já usou expressões regulares! (O re em grep refere-se a Expressões Regulares.)

Ordem a partir do menu

Adicionando apenas um pouco de complexidade, você pode corresponder 'Nick' ou' nick ' com o padrão {[[5]}. A parte entre parênteses rectos é uma classe de caracteres , O que significa que corresponde exactamente a um dos caracteres incluídos. Você também pode usar gamas em classes de caracteres, por isso [a-c] Corresponde a 'A' ou 'b' ou 'c'.

O padrão . é especial: em vez de corresponder apenas a um ponto literal, corresponde a qualquer carácter . É o mesmo conceitualmente que a classe de personagens realmente grandes [-.?+%$A-Za-z0-9...].

Pensa nas classes de carácter como menus: escolhe apenas uma. Atalhos úteis

Usar . pode poupar-lhe muita dactilografia, e existem outros atalhos para padrões comuns. Diz que queres combinar inteiros não-negativos: uma maneira de escrever é [0-9]+. Os dígitos são um alvo de correspondência frequente, pelo que poderá usar \d+ para corresponder aos inteiros não-negativos. Outros são \s (espaço em branco) e \w (caracteres de palavra: alfanuméricos ou sublinhado).

As variantes maiúsculas são os seus complementos, por isso \S corresponde a qualquerNão -caracteres em branco, por exemplo.

Uma vez não é suficiente

A partir daí, pode repetir partes do seu padrão com quantificadores . Por exemplo, o padrão ab?c corresponde a 'abc' ou 'ac' porque o quantificador ? torna o subpattern que modifica opcional. Outros quantificadores são
  • * (zero ou mais vezes)
  • + (uma ou mais vezes)
  • {n} (exactamente N vezes)
  • {n,} (pelo menos N vezes)
  • {n,m} (pelo menos N vezes mas não mais de m vezes)
Vou pôr alguns destes. blocos juntos, o padrão [Nn]*ick corresponde a todos os
  • ick
  • Nick
  • nick
  • Nnick
  • nNick
  • nnick
  • (e assim por diante)
O primeiro combate demonstra uma lição importante.: * sempre tem sucesso!Qualquer padrão pode corresponder a zero vezes.

Agrupamento

Um quantificador modifica o padrão para a sua esquerda imediata. Você pode esperar 0abc+0 para igualar '0abc0', '0abcabc0', e assim por diante, mas o padrão imediatamente à esquerda do quantificador plus é c. Isto significa 0abc+0 corresponde a '0abc0',' 0abcc0',' 0abccc0', e assim por diante.

Para corresponder uma ou mais sequências de 'abc' com zeros nas extremidades, use 0(abc)+0. Os parênteses denotam um subpattern que pode ser quantificado como uma unidade. Também é comum para os motores de expressão regular salvar ou" capturar " a parte do texto de entrada que corresponde a um grupo entre parênteses. Extrair bits desta forma é muito mais flexível e menos propenso a erros do que os índices de contagem e substr.

Alternância

Há pouco, vimos uma forma de igualar "Nick" ou "nick". Outra é com alternância como em Nick|nick. Lembre-se que a alternância inclui tudo à sua esquerda e tudo à sua direita. Usar parêntesis de agrupamento para limitar o âmbito de |, = = referências = = , (Nick|nick).

Para outro exemplo, você poderia escrever equivalentemente [a-c] Como a|b|c, mas isso é provável que seja subóptima porque muitos as implementações assumem que as alternativas terão comprimentos superiores a 1.

Escapar Apesar de alguns caracteres coincidirem, outros têm significados especiais. O padrão \d+ não corresponde à barra invertida seguida de minúsculas D seguidas de um sinal de mais: para obter isso, usaríamos \\d\+. Uma barra invertida remove o significado especial do seguinte carácter.

Greediness

Os quantificadores de Expressões Regulares são gananciosos. Isso significa que eles combinam tanto texto quanto eles é possível, ao mesmo tempo, permitir que todo o padrão corresponda com sucesso.

Por exemplo, digamos que a entrada é
"Olá", disse ela, " como estás?"

Você pode esperar {[36] } para igualar apenas 'Olá', e então vai ficar surpreso quando você vê que ele combinou de ' Olá ' todo o caminho através de 'você?'.

Para mudar de ganancioso para o que você pode pensar como cauteloso, adicione um extra ? para o quantificador. Agora você entende como \((.+?)\), o exemplo de a tua pergunta funciona. Corresponde à sequência de um parêntesis esquerdo literal, seguido por um ou mais caracteres, e terminado por um parêntesis direito.

Se a tua entrada for ' (123) (456)', então a primeira captura será'123'. Quantificadores não gananciosos querem permitir que o resto do padrão comece a corresponder o mais rápido possível.

(Quanto à sua confusão, não conheço nenhum dialeto de expressão regular onde ((.+?)) faria a mesma coisa. Suspeito que algo se perdeu em transmissão algures pelo caminho.)

Âncoras

Use o padrão especial ^ para corresponder apenas no início da sua entrada e $ para corresponder apenas no fim. Fazer " bookends "com seus padrões onde você diz," Eu sei o que está na frente e atrás, mas me dê tudo entre " é uma técnica útil.

Diga que quer corresponder com os comentários do formulário

-- This is a comment --

Você escreveria.

Constrói a tua próprio

Expressões regulares são recursivas, então agora que você entende essas regras básicas, você pode combiná-las como quiser.

Ferramentas para escrita e depuração regexes:

Livros

Recursos Livres

Nota de rodapé

†: a afirmação acima de que . Corresponde a qualquer caráter é uma simplificação para fins pedagógicos que não é estritamente verdade. O ponto corresponde a qualquer carácter excepto a newline, "\n", mas na prática raramente espera que um padrão como .+ atravesse um limite da newline. Perl regexes têm um /s switch e Java Pattern.DOTALL, por exemplo, para fazer . corresponder a qualquer personagem. Para as línguas que não têm esse recurso, você pode usar algo como [\s\S] para corresponder a "qualquer espaço em branco ou qualquer espaço não em branco", em outras palavras qualquer coisa.

 707
Author: Greg Bacon, 2018-07-18 12:05:15