регулярное выражение для сопоставления чего-либо, если ему не предшествует что-то еще

165

Так что с регулярным выражением в Java, я хочу написать регулярное выражение, которое будет соответствовать, если и только если шаблон не предшествует определенным символам. Например:

String s = "foobar barbar beachbar crowbar bar ";

Я хочу соответствовать, если bar не предшествует foo. Таким образом, вывод будет:

barbar
beachbar
crowbar
bar

Я знаю, что это, наверное, очень простой вопрос. Я пытаюсь выучить регулярные выражения, но сейчас мне нужно кое-что поработать.

b3bop
источник

Ответы:

278

Вы хотите использовать negative lookbehindтак:

\w*(?<!foo)bar

Где (?<!x)означает «только если у него нет« x »до этой точки».

Посмотрите Регулярные выражения - Lookaround для получения дополнительной информации.

Редактировать : добавил, \w*чтобы захватить символы раньше (например, "пляж").

Адам Рофер
источник
2
Какие изменения должны быть сделаны, чтобы не соответствовать foo_arbitrary_bar? то есть foo не непосредственно предшествующий бар
Брэд Кент
1
Я думаю, (?<!foo).*barчто @BradKent будет соответствовать чему-то подобному.
Эмиллер
@emyller Нету. это будет соответствовать foobazbar (foo не предшествует foobazbar, поэтому он соответствует)
Брэд Кент
2
@BradKent Я не читал ваше "не" в "не соответствует", поэтому я сказал, что оно будет соответствовать. Ваш случай выглядит как \b(?!foo)\w*bar\bдля меня тогда.
emyller
4
@BradKent Тогда вы можете либо задать новый вопрос, подробно описав, чего вы пытаетесь достичь, либо продолжить играть с регулярными выражениями, пока не найдете его сами. :)
emyller