0

我正在制作正则表达式以从药品目录中提取剂量说明。我从许多不同的品牌中获取信息,即使在一个品牌内,格式也不一致,所以我的表达必须是宽容的。正则表达式是在 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 粒,分次服用,饭前服用。 "

- 我得到dose_amount= 1-3dose_format= 胶囊dose_frequency= 每天一次,和dose_permutation= "分剂量,饭前"

但是,我遇到了以下描述的问题:

"使用说明:对于成人,每天服用一 (1) 片,最好随餐服用或遵照您的医疗保健专业人员的建议。吞咽前让片剂在舌头上溶解。提醒一下,请根据您的健康状况讨论您服用的补充剂和药物护理人员。

问题是在描述中多次使用“take”这个词。我会得到dose_amount= with,和dose_format= your。(它匹配第二个'take',而不是第一个。)

有没有办法强制正则表达式只匹配描述中的第一个“take”?我已经尝试过将其设为贪婪与非贪婪,如此所述,但我无法让它发挥作用。

谢谢你。

4

1 回答 1

0

尝试在这里替换贪婪的部分:

.*take

使用非贪婪版本:

.*?take

第一个变体消耗尽可能多的字符,第二个变体尽可能少。

于 2015-07-20T19:34:00.313 回答