Regex for matching something if it is not preceded by something else
Регулярное выражение для сопоставления чего-либо, если ему не предшествует что-либо еще
С помощью regex в Java я хочу написать регулярное выражение, которое будет соответствовать тогда и только тогда, когда шаблону не предшествуют определенные символы. Например:
Strings="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 не находится прямо слева.
В некоторых случаях было бы проще при необходимости включить предыдущую часть, а затем пропустить эти соответствия на втором шаге. Например, чтобы найти числа, которые не начинаются с "+".:
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.