Ответ 1
Используйте отрицательный прогноз, который утверждает отсутствие какого-либо из трех слов где-то на входе:
^(?!.*(trunk|tags|branches)).*$
Я также немного перестроил ваше регулярное выражение, чтобы исправить незначительные ошибки.
Я пытаюсь собрать регулярное выражение, чтобы найти, когда конкретные слова не существуют в строке. В частности, я хочу знать, когда "сундук", "теги" или "ветки" не существуют (это для крюка pre-commit Subversion). Основываясь на регулярном выражении, чтобы соответствовать строке, не содержащей слова, я могу легко сделать это для одного слова, используя отрицательные образы:
^((?!trunk).)*$
Это оператор "и", с которым я борюсь, и я не могу получить комбинации, включая два других слова, работающих.
Это прекрасно работает в .NET с одним словом:
var exp = new Regex(@"^((?!trunk).)*$");
exp.IsMatch("trunk/blah/blah");
Он вернет false, поскольку он в настоящее время стоит или истинно, если "строка" не существует в пути во второй строке.
Что мне здесь не хватает?
Используйте отрицательный прогноз, который утверждает отсутствие какого-либо из трех слов где-то на входе:
^(?!.*(trunk|tags|branches)).*$
Я также немного перестроил ваше регулярное выражение, чтобы исправить незначительные ошибки.
Используйте стандартное совпадение и найдите !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)(/|\\|$))";