Corresponder tudo, exceto para strings especificadas

Eu sei que o seguinte regex corresponderá a “red”, “green” ou “blue”.

red|green|blue 

Existe uma maneira simples de fazer corresponder tudo, exceto várias strings especificadas?

Se você quer ter certeza de que a corda não é vermelha, verde ou azul, a resposta da caskey é. O que é frequentemente desejado, no entanto, é garantir que a linha não contenha vermelho, verde ou azul em qualquer lugar. Para isso, ancorar a expressão regular com ^ e include .* No lookahead negativo:

 ^(?!.*(red|green|blue)) 

Além disso, suponha que você queira linhas contendo a palavra “engine”, mas sem nenhuma dessas colors:

 ^(?!.*(red|green|blue)).*engine 

Você pode pensar que pode levar o .* À cabeça da expressão regular:

 ^.*(?!red|green|blue)engine # Does not work 

Mas você não pode. Você tem que ter ambas as instâncias de .* para que ele funcione.

Depende da linguagem, mas geralmente há afirmações negativas que você pode colocar assim:

 (?!red|green|blue) 

(Obrigado pela correção de syntax, o acima é válido Java e Perl, YMMV)

Você não precisa de lookahead negativo. Há um exemplo de trabalho:

 /([\s\S]*?)(red|green|blue)/g 

Descrição:

  • [\s\S] – corresponde a qualquer personagem
  • * – corresponder de 0 a ilimitado do grupo anterior
  • ? – corresponder o menos possível
  • (red|green|blue) – corresponde a uma destas palavras
  • g – repetir padrão

Exemplo:

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

Será:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

Teste: regex101.com

Leva 1155 passos, mas se alguém puder melhorar, serei bem-vindo.

Combinar tudo menos as cordas

Se você quiser combinar toda a string onde você quer combinar tudo, mas certas strings você pode fazer assim:

^(?!(red|green|blue)$).*$

Isso diz, inicie a correspondência do início da string, onde ela não pode iniciar e terminar com vermelho, verde ou azul e corresponder a qualquer outra coisa no final da string.

Você pode experimentá-lo aqui: https://regex101.com/r/rMbYHz/2

Observe que isso funciona apenas com mecanismos de expressão regular que suportam uma visão antecipada negativa .

Eu tive a mesma pergunta, as soluções propostas estavam quase funcionando, mas elas tinham algum problema. No final, o regex que usei é:

 ^(?!red|green|blue).* 

Eu testei em Javascript e .NET.

. * não deve ser colocado dentro do lookahead negativo como este: ^ (?!. * red | green | blue) ou faria com que o primeiro elemento se comportasse de maneira diferente do resto (ou seja, “anotherred” não seria correspondido enquanto ” outro verde “seria)