Qual operador de expressão regular significa 'Não' corresponde a este caractere?

91

*, ?, +todos os personagens significam corresponder a este personagem. Qual caractere significa 'não' corresponde a isso? Os exemplos ajudariam.

Clique em votar positivamente
fonte
Para solução relacionada à não correspondência de uma palavra - Veja aqui stackoverflow.com/questions/406230
null

Respostas:

92

Você pode usar classes de caracteres negados para excluir certos caracteres: por exemplo [^abcde], corresponderá a qualquer coisa, exceto aos caracteres a, b, c, d, e.

Em vez de especificar todos os caracteres literalmente, você pode usar atalhos dentro das classes de caracteres: [\w](minúsculas) corresponderá a qualquer "caractere de palavra" (letra, números e sublinhado), [\W](maiúscula) corresponderá a qualquer coisa, exceto caracteres de palavra; da mesma forma, [\d]corresponderá aos dígitos 0-9, enquanto [\D]corresponderá a qualquer coisa menos aos dígitos 0-9 e assim por diante.

Se você usa PHP, pode dar uma olhada na documentação das classes de caracteres regex .

Paolo Stefan
fonte
82

Há duas maneiras de dizer "não corresponde": intervalos de caracteres e lookahead / lookbe behind negativo de largura zero.

O ex-: não corresponderem a, b, cou 0:[^a-c0]

O último: corresponde a qualquer string de três letras, exceto fooe bar:

(?!foo|bar).{3}

ou

.{3}(?<!foo|bar)

Além disso, uma correção para você: *, ?e +realmente não corresponde a nada. Eles são operadores de repetição e sempre seguem um operador de correspondência. Assim, a+os meios corresponder a um ou mais a, [a-c0]+meios corresponder a um ou mais de a, b, cou 0, enquanto que [^a-c0]+iria coincidir com um ou mais de qualquer coisa que não era a, b, cou 0.

Amadan
fonte
^((?!foo).)+$Corresponde a qualquer linha que não contenha foo regex101.com/r/z6a65l/4
Levi Baguley
49

[^] (dentro de [] ) é a negação na expressão regular, enquanto que ^é o "início da string"

[^a-z] corresponde a qualquer caractere único que não seja de "a" a "z"

^[a-z] significa que a string começa com de "a" a "z"

Referência

diEcho
fonte
9

^ usado no início de um intervalo de caracteres ou afirmações de antevisão / antevisão negativas.

>>> re.match('[^f]', 'foo')
>>> re.match('[^f]', 'bar')
<_sre.SRE_Match object at 0x7f8b102ad6b0>
>>> re.match('(?!foo)...', 'foo')
>>> re.match('(?!foo)...', 'bar')
<_sre.SRE_Match object at 0x7f8b0fe70780>
Ignacio Vazquez-Abrams
fonte
Você tem que usar ?!nos últimos 2 exemplos ou pode apenas usar !sozinho? O que ?faz aí?
Clique em Upvote
Python precisa do ?para saber que é uma extensão. Outros motores de regex podem ter suas próprias regras.
Ignacio Vazquez-Abrams
@Clique: é bastante padrão. regular-expressions.info/refadv.html , também a maioria dos manuais de mecanismo regexp dizem a mesma coisa.
Amadan