Подтвердить что ты не робот

Regex для строки, не содержащей нескольких конкретных слов

Я пытаюсь собрать регулярное выражение, чтобы найти, когда конкретные слова не существуют в строке. В частности, я хочу знать, когда "сундук", "теги" или "ветки" не существуют (это для крюка pre-commit Subversion). Основываясь на регулярном выражении, чтобы соответствовать строке, не содержащей слова, я могу легко сделать это для одного слова, используя отрицательные образы:

^((?!trunk).)*$

Это оператор "и", с которым я борюсь, и я не могу получить комбинации, включая два других слова, работающих.

Это прекрасно работает в .NET с одним словом:

var exp = new Regex(@"^((?!trunk).)*$");
exp.IsMatch("trunk/blah/blah");

Он вернет false, поскольку он в настоящее время стоит или истинно, если "строка" не существует в пути во второй строке.

Что мне здесь не хватает?

4b9b3361

Ответ 1

Используйте отрицательный прогноз, который утверждает отсутствие какого-либо из трех слов где-то на входе:

^(?!.*(trunk|tags|branches)).*$

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

Ответ 2

Используйте стандартное совпадение и найдите !IsMatch

var exp = new Regex(@"trunk|tags|branches");
var result = !exp.IsMatch("trunk/blah/blah");

Почему люди любят затруднять свою жизнь?

А... И помните принцип ass! http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html

Итак, было бы лучше написать

var exp = new Regex(@"\b(trunk|tags|branches)\b");

Но если вам действительно нужно выражение с отрицательным выражением и не отставать от принципа ass

var exp = new Regex(@"^(?!.*\b(trunk|tags|branches)\b)";

Тестер: http://gskinner.com/RegExr/?2uv1g

Отмечу, что если вы ищете полные пути (слова, разделенные / или \), то

var exp = new Regex(@"^(?!.*(^|\\|/)(trunk|tags|branches)(/|\\|$))";

Тестер: http://gskinner.com/RegExr/?2uv1p