regex untuk mencocokkan sesuatu jika tidak didahului oleh sesuatu yang lain

165

Jadi dengan regex di java, saya ingin menulis regex yang akan cocok jika dan hanya jika polanya tidak didahului oleh karakter tertentu. Sebagai contoh:

String s = "foobar barbar beachbar crowbar bar ";

Saya ingin mencocokkan jika bar tidak didahului oleh foo. Jadi outputnya adalah:

barbar
beachbar
crowbar
bar

Saya tahu ini mungkin pertanyaan yang sangat sederhana. Saya mencoba belajar regex, tetapi sementara itu saya perlu sesuatu untuk bekerja sekarang.

b3bop
sumber

Jawaban:

278

Anda ingin menggunakan negative lookbehindseperti ini:

\w*(?<!foo)bar

Di mana (?<!x)berarti "hanya jika tidak memiliki" x "sebelum titik ini".

Lihat Ekspresi Reguler - Lookaround untuk informasi lebih lanjut.

Sunting : menambahkan \w*untuk menangkap karakter sebelumnya (mis. "Pantai").

Adam Rofer
sumber
2
modifikasi apa yang perlu dilakukan agar tidak cocok dengan foo_arbitrary_bar? yaitu foo tidak segera mendahului bar
Brad Kent
1
@BradKent (?<!foo).*barakan cocok dengan sesuatu seperti itu, saya percaya.
emyller
@emyller nggak. yang akan cocok dengan foobazbar (foo tidak datang sebelum foobazbar, jadi itu cocok)
Brad Kent
2
@BradKent Saya tidak membaca "tidak" di "tidak cocok", itu sebabnya saya mengatakan itu akan cocok. Kasing Anda terlihat seperti \b(?!foo)\w*bar\bbagi saya kemudian.
emyller
4
@BradKent Kemudian Anda dapat mengajukan pertanyaan baru, menguraikan apa yang ingin Anda capai secara terperinci, atau terus bermain dengan ekspresi reguler hingga Anda menemukannya sendiri. :)
emyller