Как сделать так, чтобы PHP Regex Option-Group не стремился?

У меня есть регулярное выражение, которое ищет шаблон, заканчивающийся группой опций ngrams. Вот регулярное выражение:

$regex = '/.{0,150}\b(is (.{0,50}?)\b(assembler|builder|consulter|contracter|contractor|contract manufacturer|converter|designer|distributer|distributor|engineerer|fabricater|fabricator|formulater|formulator|installer|machiner|manufacturer|offerer|producer|provider|reseller|seller|supplier|wholesaler|machine shop|job shop|law firm|marketer|marketing agency))\b([^.!?<>]{0,150})\b/'

Вот строка, с которой я сопоставляю:

$string = 'ABC Company Inc. is a Distributor, Fabricator, and Manufacturer of textiles. Another sentence.';

Цель состоит в том, чтобы извлечь «Дистрибьютор, Изготовитель и Производитель» с первой группой сбора регулярных выражений. Остальная часть регулярного выражения предназначена только для определения контекста, и в идеале обычно заканчивается в конце предложения или после определенной длины.

Прямо сейчас моя первая группа захвата стремится и соответствует только «является дистрибьютором». Как я могу сделать это не нетерпеливым?

2

Решение

Немного более короткая версия без дублирования (не в code-tag, потому что однострочная не читается):

.{0150} \ Ь (есть ([^.!?<>] {0,50} (ассемблер | строитель | консультант | подрядчик | подрядчик | контрактный производитель | конвертер | проектировщик | дистрибьютор | дистрибьютор | инженер | производитель — производитель | разработчик | разработчик | установщик | механик | производитель | производитель | поставщик | производитель | поставщик | реселлер | продавец | поставщик | оптовик | механический цех | мастерская | юридическая фирма | маркетолог | маркетинговое агентство)) +) \ b ([^.!?<>] {0150} \ б)

Идея состоит в том, чтобы разрешить префиксы длиной не более 50 символов (к счастью, существует только одна такая константа, поэтому ее легко найти) перед каждым ключевым словом, независимо от того, является ли оно другим ключевым словом в перечислении. Чтобы поймать перечисление я добавил +) после списка ключевых слов.

Проверьте Вот.

1

Другие решения

.{0,150}\b(is (.{0,50}?)\b(assembler|builder|consulter|contracter|contractor|contract manufacturer|converter|designer|distributer|distributor|engineerer|fabricater|fabricator|formulater|formulator|installer|machiner|manufacturer|offerer|producer|provider|reseller|seller|supplier|wholesaler|machine shop|job shop|law firm|marketer|marketing agency)(.*?\b(assembler|builder|consulter|contracter|contractor|contract manufacturer|converter|designer|distributer|distributor|engineerer|fabricater|fabricator|formulater|formulator|installer|machiner|manufacturer|offerer|producer|provider|reseller|seller|supplier|wholesaler|machine shop|job shop|law firm|marketer|marketing agency))*)\b([^.!?<>]{0,150})\b

Это супер длинное регулярное выражение может сделать это. Смотрите демо.

https://regex101.com/r/sJ9gM7/39

1

По вопросам рекламы [email protected]