регулярний вираз для відповідності чомусь, якщо йому не передує щось інше


164

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

String s = "foobar barbar beachbar crowbar bar ";

Я хочу відповідати, якщо смузі не передує foo. Таким чином, вихід буде таким:

barbar
beachbar
crowbar
bar

Я знаю, це, мабуть, дуже просте запитання. Я намагаюся навчитися регексу, але тим часом мені потрібно щось над цим працювати.

Відповіді:


277

Ви хочете використовувати negative lookbehindтак:

\w*(?<!foo)bar

Де (?<!x)означає "лише якщо у цього пункту немає" x "перед цією точкою".

Докладнішу інформацію див. У розділі Регулярні вирази - пошук .

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


2
які зміни потрібно внести, щоб вони не відповідали foo_arbitrary_bar? тобто foo, що не передує смузі
Бред Кент

1
@BradKent відповів (?<!foo).*barби щось подібне, я вважаю.
еміллер

@emyller nope. це буде відповідати foobazbar (foo не приходить до foobazbar, тому воно відповідає)
Brad Kent

2
@BradKent Я не читав "не" в "не збігається", тому я сказав, що це буде відповідати. \b(?!foo)\w*bar\bТоді ти виглядаєш як мені.
еміллер

4
@BradKent Тоді ви можете або задати нове запитання, детально розробивши, чого ви намагаєтесь досягти, або продовжувати грати з регулярними виразами, поки не знайдете його самі. :)
еміллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.