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.
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):
Pattern.compile("(?!(a.*b))").matcher("xab").matches()
deve ser true
, certo?
Supondo que você só deseja proibir strings que correspondam completamente à regex (ou seja, mmbla
está tudo bem, mas mm
não é), isso é o que você deseja:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
é uma antevisão negativa ; ele diz "começando da posição atual, os próximos caracteres não são mm
ou t
, 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.
.*
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.
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
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
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.
'email' => 'not_regex:/^.+$/i'
{1}
é completamente inútil. (Se você acha que fornece algum valor, por que não escreve((m{1}a{1}){1}|(t){1}){1}
?)