Como negar todo o regex?

Eu tenho um regex, por exemplo (ma|(t){1}) . Ele combina ma e t e não combina com bla .

Eu quero negar o regex, portanto, ele deve corresponder ao bla e não ao ma e ao adicionar algo a esse regex . Eu sei que posso escrever bla , mas o regex atual é mais complexo.

Use lookaround negativo: (?! pattern )

Lookarounds positivos podem ser usados ​​para afirmar que um padrão corresponde. O lookaround negativo é o oposto: é usado para afirmar que um padrão NÃO combina. Algum sabor suporta asserções; alguns coloca limitações no lookbehind, etc.

Links para regular-expressions.info

  • LookAhead e Lookbehind Asserções Zero Largura
  • Comparação de sabor

Veja também

  • Como faço para converter o CamelCase em nomes legíveis por humanos em Java?
  • Regex para todas as strings que não contêm uma string?
  • Um regex para corresponder a uma substring que não é seguida por outra substring.

Mais exemplos

Estas são tentativas de encontrar soluções de regex para problemas de brinquedo como exercícios; eles devem ser educacionais se você estiver tentando aprender as várias maneiras de usar lookarounds (aninhando-os, usando-os para capturar, etc.):

  • codingBat plusOut usando regex
  • codingBat repeatEnd usando regex
  • codingbat wordEnds usando regex

Supondo que você só quer desautorizar as strings que correspondem ao regex completamente (ou seja, mmbla está ok, mas mm não é), é isso que você quer:

 ^(?!(?:m{2}|t)$).*$ 

(?!(?:m{2}|t)$) é um lookahead negativo; ele diz “a partir da posição atual, os próximos caracteres não são mm ou t , seguidos do final da string”. A âncora de início ( ^ ) no início garante que o lookahead seja aplicado no início da string. Se isso for bem sucedido, o .* vai em frente e consome a cadeia.

FYI, se você estiver usando o método matches() do Java, você realmente não precisa do ^ e do $ final, mas eles não causam nenhum dano. O $ dentro do lookahead é necessário, no entanto.

 \b(?=\w)(?!(ma|(t){1}))\b(\w*) 

isto é para o regex dado.
o \ b é encontrar o limite de palavras.
o olhar positivo à frente (? = \ w) está aqui para evitar espaços.
o olhar negativo em relação ao regex original é evitar correspondências.
e finalmente o (\ w *) é pegar todas as palavras que restam.
o grupo que terá as palavras é o grupo 3.
o simples (?! padrão) não funcionará como qualquer sub-string irá corresponder
o simples ^ (?! (?: m {2} | t) $). * $ não funcionará, pois sua granularidade é linhas completas

    Intereting Posts