Как я могу заставить мое Регулярное выражение взять первое совпадение и игнорировать любые последующие совпадения?
Я делаю регулярные выражения, чтобы извлечь инструкции по дозировке из фармацевтического каталога. Я получаю информацию от разных брендов, и форматирование не согласовано даже внутри бренда, поэтому мое выражение должно быть немного мягким. Регулярные выражения реализуются в Ruby (но не мной).
Мое регулярное выражение выглядит следующим образом:
/(take|chew\s|usage:|use:|intake:|dosage:?|dose:|directions:|recommendations:|adults:)\s*(.*take\s+|.*chew\s+|.*mix\s+|.*supplement,\s+)?(?<dosage_amount>\S+(\sto\s\S+)?(\sor\s\S+)?(\s\(\d+\)\s)?\b)[\s,](?<dosage_format>\S+\b(\s\([\w\-\.]+\))?)?[\s,]*?(?<dosage_frequency>[\S\s]*(daily|per day|a day|needed|morning|evening))?[\s,]?\s?(daily\s)?(?<dosage_permutation>(with|on|at|in|before|after|taken)[,\w\s\-]*)?(?=or as|\.)?/
Пример кода, работающего правильно, будет со следующим описанием -
"Рекомендуемое применение: в качестве пищевой добавки принимайте 1-3 капсулы в день, в разделенных дозах, перед едой".
- где я получаю dosage_amount= 1-3, dosage_format= капсула, dosage_frequency = один раз в день и dosage_permuation= "в разделенных дозах, перед едой".
Тем не менее, я получаю проблемы с описаниями, такими как:
Рекомендации по применению: взрослым принимайте по одной (1) таблетке в день, желательно во время еды или следуя советам своего врача. Дайте таблеткам раствориться на языке перед глотанием. В качестве напоминания обсудите добавки и лекарства, которые вы принимаете со своим здоровьем. поставщики услуг ".
Проблема в том, что слово "взять" используется в описании более одного раза. Я получу dosage_amount= с, а dosage_format= ваш. (Это соответствует второму "дублю", а не первому.)
Есть ли способ заставить регулярное выражение совпадать только с первым "взятием" в описании? Я попытался поэкспериментировать с тем, чтобы сделать его жадным, а не жадным, как описано здесь, но я не могу заставить его работать.
Спасибо.
1 ответ
Попробуйте заменить жадную часть здесь:
.*take
с не жадной версией:
.*?take
Первый вариант потребляет как можно больше символов, а второй - как можно меньше.