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