Aprender expressões regulares [fechado]
1 answers
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...]
.
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ãoab?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)
[Nn]*ick
corresponde a todos os
- ick
- Nick
- nick
- Nnick
- nNick
- nnick
- (e assim por diante)
*
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 emNick|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.
\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
Você escreveria.
-- This is a comment --
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:
- RegExr (para JavaScript)
- Perl: YAPE: Regex explicar
- Regex Coach (motor apoiado por CL-PPC)
- RegexPal (para JavaScript)
- Testador De Expressões Regulares Online
- Regex Buddy
- Regex 101 (para PCRE, JavaScript, Python, Golang)
- Expressão Regular Visual
- Expresso (para. NET)
- Rubular (para Ruby)
- biblioteca de Expressões Regulares (expressões predefinidas para cenários comuns)
- Txt2RE
- teste Regex (para JavaScript)
- tempestade Regex (para .NET)
- Depuggex (Testador e ajudante de regex visual)
- dominar Expressões Regulares, a 2.A edição, e a 3. a edição.
- Folha De Batota Das Expressões Regulares
- Livro De Receitas Regex
- Ensinar A Si Mesmo Expressões Regulares
Recursos Livres
- Expressões Regulares-tudo o que você should know (PDF Series)
- Resumo De Sintaxe Regex
- Como Funcionam As Expressões Regulares
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.