Regex соответствует шаблону, но исключает набор слов

Я просматривал SO, и хотя на этот вопрос был дан ответ в одном сценарии:

Regex для соответствия всем словам, кроме данного списка

Это не совсем то, что я ищу. Я пытаюсь написать регулярное выражение, которое соответствует любой строке формы [\ w] + [(], но которая не соответствует трем строкам: "cat (", "dog (" and "sheep (" specific.

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

Ответы

Ответ 1

Если реализация регулярного выражения поддерживает прогнозные или прогнозные утверждения, вы можете использовать следующее:

  • Использование отрицательного ожидания:

     \b(?!(?:cat|dog|sheep)\()\w+\(
    
  • Использование отрицательного внешнего вида:

     \b\w+\((?<!\b(?:cat|dog|sheep)\()
    

Я добавил якорь \b, который отмечает границу слова. Таким образом, catdog( будет сопоставлен, хотя он содержит dog(.

Однако, хотя утверждения с открытым исходным кодом более широко поддерживаются реализациями регулярных выражений, регулярное выражение с утверждением look-behind более эффективно, поскольку оно проверено только в том случае, если предыдущее регулярное выражение (в нашем случае \b\w+\() уже соответствовало. Однако прогнозное утверждение будет проверено до соответствия фактическому регулярному выражению. Таким образом, в нашем случае утверждение с перспективой проверяется всякий раз, когда \b сопоставляется.

Ответ 2

Вам действительно нужно это в одном регулярном выражении? Если нет, то самая простая реализация - это всего лишь два регулярных выражения: один, чтобы проверить, что вы не соответствуете одному из ваших запрещенных слов, и один из них соответствует вашему \w +, закованному в цепочку с логическим И.