Respostas:
Você pode usar uma afirmação antecipada:
(?!999)\d{3}
Este exemplo corresponde a três dígitos diferentes de 999
.
Mas se você não possui uma implementação de expressão regular com esse recurso (consulte Comparação de sabores de expressões regulares ), provavelmente precisará criar uma expressão regular com os recursos básicos por conta própria.
Uma expressão regular compatível apenas com sintaxe básica seria:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Isso também corresponde a qualquer sequência de três dígitos que não seja 999
.
Se você deseja combinar uma palavra A em uma string e não 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ê deseja pesquisar linhas de texto que TÊM um cachorro para animais de estimação e NÃO têm gato, use esta expressão regular:
^(?=.*?\bdog\b)((?!cat).)*$
Ele encontrará apenas a segunda linha:
2. I have a pet - dog
findstr
comando DOS . Ele oferece apenas um pequeno subconjunto dos recursos que você espera encontrar em uma ferramenta regex; lookahead não está entre eles. (Eu apenas acrescentou o findstr tag mim mesmo.)
Faça a correspondência com o padrão e use o idioma do host para inverter o resultado booleano da correspondência. 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 foi mencionada. (Encontre sua pergunta ao fazer uma pesquisa para uma missão 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 isenções de responsabilidade sobre a análise de html no regex): A é dígitos, B é dígitos dentro <a tag
A regex: <a.*?<\/a>|(\d+)
Demonstração (veja o Grupo 1 no painel inferior direito)
Referência
\d
por [[:digit:]]
. A primeira referência menciona que é específico para Perl e PHP: "Há uma variação usando sintaxe específica para Perl e PHP que realiza o mesmo."
O complemento de um idioma comum também é um idioma comum, mas para construí-lo, é necessário criar o DFA para o idioma comum e transformar qualquer estado válido em erro. Veja isso para um exemplo. O que a página não diz é que ele convertido /(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.
replace
str.replace(/re/g, '')
, então não há necessidade de se juntar a eles. Além disso, se você jogar uma boa trilha? como str.replace(/\re\s?/g, '')
então você se livra de todos os espaços duplicados que você teria de algo sendo substituído no meio de uma cadeia de caracteres
Minha resposta aqui também pode resolver seu problema:
https://stackoverflow.com/a/27967674/543814
$1
, você leu grupo $2
.$2
foi feito sem captura lá, 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
,.
findstr
tag, pois todas as respostas aqui não são válidas para a tag.