Вопрос-ответ

Regex for matching something if it is not preceded by something else

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

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

String s = "foobar barbar beachbar crowbar bar ";

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

barbar
beachbar
crowbar
bar
Переведено автоматически
Ответ 1

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

\w*(?<!foo)bar

Где (?<!x) означает "только если перед этой точкой нет "x"".

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

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

Ответ 2

Другой вариант - сначала сопоставить необязательные символы слова, за которыми следует bar, и когда это совпадет, проверьте, что то, что находится непосредственно слева, не является foobar.

Сначала после сопоставления будет выполнено утверждение lookbehind bar.

\w*bar(?<!foobar)

  • \w* Сопоставьте 0+ символов word

  • bar Совпадение буквально

  • (?<!foobar) Отрицательный взгляд назад, утверждение из текущей позиции foobar не находится прямо слева.

Демонстрация регулярных выражений

Ответ 3

В некоторых случаях было бы проще при необходимости включить предыдущую часть, а затем пропустить эти соответствия на втором шаге. Например, чтобы найти числа, которые не начинаются с "+".:

if (preg_match_all('/(\+?[0-9][0-9\s\-].*[0-9])/s',$text,$matches)) {
foreach($matches[1] as $match) {
if(substr($match,0,1) == '+'){
continue;
}
// continue processing
}
}

Отрицательный анализ не сработал, поскольку он все равно соответствовал бы 2+ цифрам, но не включал бы первую цифру в совпадении. Например, + 1234 будет возвращено как 234.

2023-09-25 07:31 java regex