Eu tenho uma regex, por exemplo (ma|(t){1})
. Corresponde a ma
e t
e não correspondebla
.
Eu quero negar a regex, portanto, ela deve corresponder bla
e não ma
e t
, adicionando algo a esta regex . Eu sei que posso escrever bla
, mas o regex real é mais complexo.
regex
regex-negation
IAdapter
fonte
fonte
{1}
é completamente inútil. (Se você acha que fornece algum valor, por que não escreve((m{1}a{1}){1}|(t){1}){1}
?)Respostas:
Use lookaround negativo:
(?!
pattern
)
Lookarounds positivos podem ser usados para afirmar que um padrão corresponde. Lookarounds negativo é o oposto: é usado para afirmar que um padrão NÃO corresponde. Alguns sabores apóiam afirmações; alguns colocam limitações no olhar para trás, etc.
Links para regular-expressions.info
Veja também
Mais exemplos
Essas são tentativas de criar soluções regex para problemas de brinquedos como exercícios; eles devem ser educacionais se você está tentando aprender as várias maneiras de usar lookarounds (aninhando-os, usando-os para capturar, etc):
fonte
grep
.Pattern.compile("(?!(a.*b))").matcher("xab").matches()
deve sertrue
, certo?Supondo que você só deseja proibir strings que correspondam completamente à regex (ou seja,
mmbla
está tudo bem, masmm
não é), isso é o que você deseja:(?!(?:m{2}|t)$)
é uma antevisão negativa ; ele diz "começando da posição atual, os próximos caracteres não sãomm
out
, seguidos pelo final da string." A âncora inicial (^
) no início garante que o lookahead seja aplicado no início da string. Se der certo, o.*
segue e consome a string.Para sua informação, se você estiver usando o
matches()
método Java , você realmente não precisa do the^
e do final$
, mas eles não causam nenhum dano. No$
entanto, o interior do lookahead é obrigatório.fonte
.*
ao final de sua regex, caso contrário, todas as strings serão rejeitadas.$
interior do lookahead negativo E o.*
no final são ambos bits críticos. Como sempre com REs, um forte conjunto de testes de unidade é absolutamente crítico para acertar. Esta resposta está 100% correta.isso é para a regex fornecida.
the \ b é encontrar o limite da palavra.
o olhar positivo à frente (? = \ w) está aqui para evitar espaços.
a análise negativa da regex original é evitar correspondências dela.
e finalmente o (\ w *) serve para capturar todas as palavras que sobraram.
o grupo que conterá as palavras é o grupo 3.
o simples (?! padrão) não funcionará, pois qualquer subcadeia corresponderá
ao simples ^ (?! (?: m {2} | t) $). * $ será não funciona, pois sua granularidade é linhas completas
fonte
Aplique se você usar laravel.
O Laravel possui um not_regex onde o campo sob validação não deve corresponder à expressão regular fornecida; usa a
preg_match
função PHP internamente.fonte