regex per abbinare qualcosa se non è preceduto da qualcos'altro


165

Quindi con regex in java, voglio scrivere una regex che corrisponderà se e solo se il modello non è preceduto da determinati caratteri. Per esempio:

String s = "foobar barbar beachbar crowbar bar ";

Voglio abbinare se la barra non è preceduta da foo. Quindi l'output sarebbe:

barbar
beachbar
crowbar
bar

So che questa è probabilmente una domanda molto semplice. Sto cercando di imparare regex, ma nel frattempo ho bisogno di qualcosa per funzionare ora.

Risposte:


278

Vuoi usare negative lookbehindcosì:

\w*(?<!foo)bar

Dove (?<!x)significa "solo se non ha" x "prima di questo punto".

Vedi Espressioni regolari - Lookaround per ulteriori informazioni.

Modifica : aggiunto il \w*per catturare i personaggi prima (es. "Spiaggia").


2
quali modifiche devono essere apportate per non corrispondere a foo_arbitrary_bar? cioè foo non immediatamente precedente la barra
Brad Kent il

1
@BradKent (?<!foo).*barcorrisponderebbe a qualcosa del genere, credo.
emyller,

@emyller no. che corrisponderà a foobazbar (foo non viene prima di foobazbar, quindi corrisponde)
Brad Kent,

2
@BradKent Non ho letto il tuo "non" in "non abbinare", per questo motivo ho detto che corrisponderebbe. Il tuo caso mi sembra un caso \b(?!foo)\w*bar\ballora.
emyller,

4
@BradKent Quindi puoi porre una nuova domanda, elaborando in dettaglio ciò che stai cercando di ottenere o continuare a giocare con le espressioni regolari fino a quando non lo trovi da solo. :)
emyller,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.