Regex – como combinar tudo, exceto um padrão específico

Como escrevo um regex para corresponder a qualquer string que não atenda a um padrão específico? Estou diante de uma situação em que tenho que corresponder a um padrão (A e ~ B).

    Você poderia usar uma declaração de antecipação:

    (?!999)\d{3} 

    Este exemplo corresponde a três dígitos diferentes de 999 .


    Mas se acontecer de você não ter uma implementação de expressão regular com esse recurso (consulte Comparação de sabores de expressão regular ), você provavelmente terá que criar uma expressão regular com os resources básicos por conta própria.

    Uma expressão regular compatível com a syntax básica seria apenas:

     [0-8]\d\d|\d[0-8]\d|\d\d[0-8] 

    Isso também corresponde a qualquer seqüência de três dígitos que não seja 999 .

    Se você quiser corresponder uma palavra A em uma string e não corresponder a uma palavra B. Por exemplo: Se você tiver um texto:

     1. I have a two pets - dog and a cat 2. I have a pet - dog 

    Se você quiser procurar por linhas de texto que tem um cachorro para um animal de estimação e não tem gato, você pode usar esta expressão regular:

     ^(?=.*?\bdog\b)((?!cat).)*$ 

    Ele encontrará apenas segunda linha:

     2. I have a pet - dog 

    Combine com o padrão e use o idioma do host para inverter o resultado booleano da partida. Isso será muito mais legível e sustentável.

    não, ressuscitando essa questão antiga porque tinha uma solução simples que não era mencionada. (Encontrou sua pergunta enquanto fazia alguma pesquisa para uma quest de recompensa regex .)

    Estou diante de uma situação em que tenho que corresponder a um padrão (A e ~ B).

    O regex básico para isso é assustadoramente simples: B|(A)

    Você simplesmente ignora as correspondências gerais e examina as capturas do Grupo 1, que conterão A.

    Um exemplo (com todas as renúncias sobre a análise de html na regex): A é dígitos, B é dígitos dentro de

    O regex: |(\d+)

    Demonstração (veja o Grupo 1 no painel inferior direito)

    Referência

    Como combinar o padrão, exceto nas situações s1, s2, s3

    Como combinar um padrão a menos que ...

    O complemento de uma linguagem regular também é uma linguagem regular, mas, para construí-la, você precisa criar o DFA para o idioma regular e transformar qualquer alteração de estado válida em erro. Veja isto para um exemplo. O que a página não diz é que ela converteu /(ac|bd)/ em /(a[^c]?|b[^d]?|[^ab])/ . A conversão de um DFA de volta para uma expressão regular não é trivial. É mais fácil se você puder usar a expressão regular inalterada e alterar a semântica no código, como sugerido anteriormente.

    padrão – re

     str.split(/re/g) 

    retornará tudo, exceto o padrão.

    Teste aqui

    Minha resposta aqui pode resolver seu problema também:

    https://stackoverflow.com/a/27967674/543814

    • Em vez de replace, você usaria Match.
    • Em vez do grupo $1 , você lia o grupo $2 .
    • O grupo $2 foi feito sem captura, o que você evitaria.

    Exemplo:

    Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

    O primeiro grupo de captura especifica o padrão que você deseja evitar. O último grupo de captura captura todo o resto. Simplesmente leia esse grupo, $2 .

     (B)|(A) 

    então use o grupo 2 que captura …