java tester Un regex per abbinare una sottostringa che non è seguita da una certa altra sottostringa




regular expression javascript example (4)

Ho bisogno di una regex che corrisponda a blahfooblah ma non blahfoobarblah

Voglio che corrisponda solo a foo e tutto ciò che sta intorno a foo, a patto che non sia seguito da bar.

Ho provato ad usare questo: foo.*(?<!bar) che è abbastanza vicino, ma corrisponde a blahfoobarblah . L'aspetto negativo dietro deve corrispondere a qualsiasi cosa e non solo alla barra.

Il linguaggio specifico che sto usando è Clojure che utilizza regex Java sotto il cofano.

EDIT: Più specificamente, ho anche bisogno che passi blahfooblahfoobarblah ma non blahfoobarblahblah .


Per abbinare un foo seguito da qualcosa che non inizia con la bar , prova

foo(?!bar)

La tua versione con lookbehind negativo è effettivamente "match a foo seguito da qualcosa che non termina in bar ". Il .* barblah tutti i barblah e il (?<!bar) guarda indietro a lah e controlla che non corrisponda alla bar , cosa che non fa, quindi l'intero schema corrisponde.


La tua specifica richiesta di abbinamento può essere abbinata a:

\w+foo(?!bar)\w+

Questo corrisponderà a blahfooblahfoobarblah ma non blahfoobarblahblah .

Il problema con la tua regex di foo.*(?<!bar) è il .* Dopo foo . Corrisponde a tutti i personaggi compresi i caratteri dopo la bar .


Utilizza invece un look negativo per il futuro:

\s*(?!\w*(bar)\w*)\w*(foo)\w*\s*

Questo ha funzionato per me, spero che aiuti. In bocca al lupo!


Hai scritto un commento suggerendo che ti piace lavorare in modo che corrisponda a tutte le parole in una stringa piuttosto che all'intera stringa stessa.

Piuttosto che schiacciare tutto questo in un commento, lo sto postando come una nuova risposta.

Nuovo Regex

/(?=\w*foo(?!bar))(\w+)/

Testo di esempio

foowithbar fooevenwithfoobar notfoobar foohere notfoobarhere butfooisokherebar notfoobarhere andnofuu needsfoo

fiammiferi

foowithbar fooevenwithfoobar foohere butfooisokherebar needsfoo





clojure