Encontrei essas coisas no meu corpo regex, mas não tenho idéia do que posso usá-las. Alguém tem exemplos para que eu possa tentar entender como eles funcionam?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
regex
lookaround
Spidfire
fonte
fonte
Respostas:
Exemplos
Dada a sequência
foobarbarfoo
:Você também pode combiná-los:
Definições
Olhe adiante positivo
(?=)
Encontre a expressão A em que a expressão B segue:
Olhe para o lado negativo
(?!)
Encontre a expressão A em que a expressão B não segue:
Olhe para trás positivo
(?<=)
Encontre a expressão A em que a expressão B precede:
Olhe para trás negativo
(?<!)
Encontre a expressão A em que a expressão B não precede:
Grupos atômicos
(?>)
Um grupo atômico sai de um grupo e joga fora padrões alternativos após o primeiro padrão correspondente dentro do grupo (o retorno é desativado).
(?>foo|foot)s
aplicado afoots
corresponderá à sua primeira alternativafoo
, falhará comos
não segue imediatamente e parar quando o retorno estiver desativadoUm grupo não atômico permitirá retroceder; se a correspondência subsequente falhar, ela retornará e usará padrões alternativos até que uma correspondência para toda a expressão seja encontrada ou todas as possibilidades sejam esgotadas.
(foo|foot)s
aplicado àfoots
vontade:foo
, falhe comos
não segue imediatamentefoots
e retorne à sua segunda alternativa;foot
, em seguida, obtenha o sucessos
imediatamente a seguirfoots
e pare.Alguns recursos
Testadores online
fonte
Lookarounds são asserções de largura zero. Eles verificam uma regex (à direita ou à esquerda da posição atual - com base na frente ou atrás), obtém êxito ou falha quando uma correspondência é encontrada (com base na positiva ou negativa) e descarta a parte correspondente. Eles não consomem nenhum caractere - a correspondência para a regex que os segue (se houver) começará na mesma posição do cursor.
Leia regular-expression.info para mais detalhes.
Sintaxe:
Corresponder apenas se REGEX_1 corresponder; depois de corresponder a REGEX_1, a correspondência é descartada e a pesquisa por REGEX_2 começa na mesma posição.
exemplo:
REGEX_1
[a-z0-9]{4}$
corresponde a quatro caracteres alfanuméricos seguidos pelo final da linha.REGEX_2 é o
[a-z]{1,2}[0-9]{2,3}
que corresponde a uma ou duas letras seguidas por dois ou três dígitos.REGEX_1 garante que o comprimento da string seja realmente 4, mas não consome nenhum caractere, para que a pesquisa por REGEX_2 comece no mesmo local. Agora REGEX_2 garante que a sequência corresponda a outras regras. Sem olhar para frente, seria igual a três ou cinco cordas.
Sintaxe:
Corresponder apenas se REGEX_1 não corresponder; depois de verificar REGEX_1, a pesquisa por REGEX_2 começa na mesma posição.
exemplo:
A parte antecipada verifica
FWORD
a sequência e falha se a encontrar. Se não encontrarFWORD
, o olhar adiante terá êxito e a parte a seguir verificará se o comprimento da string está entre 10 e 30 e se contém apenas caracteres de palavrasa-zA-Z0-9_
O look-behind é semelhante ao look-ahead: apenas olha atrás da posição atual do cursor. Alguns tipos de expressões regulares como o javascript não suportam asserções de look-behind. E a maioria dos sabores que o suportam (PHP, Python etc) exigem que essa parte do look-behind tenha um comprimento fixo.
fonte
(?=REGEX_1)REGEX_2
só corresponderia seREGEX_2
vier depoisREGEX_1
?Grokking olha rapidamente.
Como distinguir lookahead e lookbehind? Faça um passeio de 2 minutos comigo:
Suponha
Agora, perguntamos a B: onde você está?
B tem duas soluções para declarar sua localização:
Um, B tem A à frente e tem C bebind
Dois, B está à frente (à frente) de C e atrás (a atrás) A.
Como podemos ver, o passado e o futuro são opostos nas duas soluções.
Regex é a solução dois.
fonte