Risposte:
Usa lookaround negativo: (?!
pattern
)
I lookaround positivi possono essere utilizzati per affermare che un pattern corrisponde. Il lookaround negativo è l'opposto: è usato per affermare che un pattern NON corrisponde. Alcuni gusti supportano le asserzioni; alcuni mettono limitazioni al lookbehind, ecc.
Questi sono tentativi di trovare soluzioni regex ai problemi dei giocattoli come esercizi; dovrebbero essere educativi se stai cercando di imparare i vari modi in cui puoi usare i lookaround (annidandoli, usandoli per catturare, ecc.):
grep
.
Pattern.compile("(?!(a.*b))").matcher("xab").matches()
dovrebbe essere true
, giusto?
Supponendo che tu voglia disabilitare solo le stringhe che corrispondono completamente alla regex (cioè, mmbla
va bene, ma mm
non lo è), questo è quello che vuoi:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
è un lookahead negativo ; dice "a partire dalla posizione corrente, i prossimi caratteri non sono mm
o t
, seguiti dalla fine della stringa". Lo start anchor ( ^
) all'inizio assicura che il lookahead sia applicato all'inizio della stringa. Se ha successo, .*
va avanti e consuma la stringa.
Cordiali saluti, se stai usando il matches()
metodo Java , non hai davvero bisogno di the ^
e final $
, ma non fanno alcun danno. Tuttavia, $
è necessario l'interno del lookahead.
.*
alla fine della tua regex, altrimenti rifiuterà ogni stringa.
$
interno del lookahead negativo E quello .*
alla fine sono entrambi bit critici. Come sempre con le RE, una serie forte di unit test è assolutamente fondamentale per farlo bene. Questa risposta è corretta al 100%.
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
questo è per la data regex.
la \ b serve per trovare il confine della parola.
lo sguardo positivo in avanti (? = \ w) è qui per evitare spazi.
lo sguardo negativo in avanti rispetto alla regex originale è impedire che corrisponda.
e infine il (\ w *) è quello di catturare tutte le parole che sono rimaste.
il gruppo che conterrà le parole è il gruppo 3.
il semplice (?! pattern) non funzionerà in quanto qualsiasi sottostringa corrisponderà
alla semplice ^ (?! (?: m {2} | t) $). * $ non funziona in quanto la sua granularità è piena
Applicalo se usi laravel.
Laravel ha un not_regex dove il campo sotto convalida non deve corrispondere all'espressione regolare data; utilizza preg_match
internamente la funzione PHP .
'email' => 'not_regex:/^.+$/i'
{1}
è completamente inutile. (Se pensi che fornisca un valore, perché non scrivi((m{1}a{1}){1}|(t){1}){1}
?)