Регулярное выражение: захватить первый экземпляр слова, если между ними нет запрещенного слова

Мне нужно сопоставить первый экземпляр любого из двух слов («ветчина» или «индейка») ТОЛЬКО, если любое слово следует за словом «бутерброд» И слово «запрещено» отсутствует между «бутерброд» и («ветчина» или "индейка").

reuben sandwich with ham and turkey ham sandwich with cheese
reuben sandwich with forbidden ham and turkey ham sandwich with cheese

Регулярное выражение, которое я использую, sandwich(.*?)(?!.*forbidden)(ham)((.*?)(turkey))? по-прежнему соответствует второму предложению. Как я могу изменить регулярное выражение, чтобы оно НЕ соответствовало второму предложению. Заранее спасибо!


person django-d    schedule 30.06.2017    source источник
comment
Немного сложно понять вашу проблему, но, возможно, regex101.com/r/gOs3ci/1 поможет.   -  person Wiktor Stribiżew    schedule 30.06.2017
comment
Или вы имеете в виду, что вам нужно сопоставить ham, а затем еще и turkey после него?   -  person Wiktor Stribiżew    schedule 30.06.2017
comment
Спасибо, я думаю, это именно то, что мне нужно. Мне нужно добавить в конце дополнительную ветчину или индейку, но я сам добавил это бутерброд((?:(?!запрещено).)*?)(ветчина|индейка)(.*?)(ветчина|индейка)   -  person django-d    schedule 30.06.2017
comment
Просто сделал несколько быстрых тестов, и это сработает. Если вы хотите добавить в качестве официального ответа, я приму его. Очень признателен!!!   -  person django-d    schedule 30.06.2017


Ответы (1)


Вы можете использовать

sandwich((?:(?!forbidden).)*?)(ham|turkey)

См. демонстрацию регулярного выражения.

  • sandwich - соответствует подстроке sandwich
  • ((?:(?!forbidden).)*?) - Группа 1 соответствует любому символу, который не начинается с forbidden слова, ноль или более раз, как можно меньше
  • (ham|turkey) - либо ham, либо turkey.

Вот некоторые варианты, которые вы можете рассмотреть для своих сценариев:

person Wiktor Stribiżew    schedule 30.06.2017