2015-07-20 113 views
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胶囊每天,在分次服用,在饭前

- 在那里我得到dosage_amount = 1-3dosage_format =帽苏雷dosage_frequency每天=一次,dosage_permutation = “分开的剂量,餐前”

但是,我得到的问题类似的描述:

路线: 对于成年人来说,采取一(1)每天服药,最好随餐服用或遵循您的健康护理专业的建议让平板电脑作为提示,讨论您向医护人员提供的补充剂和药物

问题是在说明中多次使用”take“这个词。我会得到dosage_amount =与,并dosage_format =您的。 (这是相匹配的第二个“走”,而不是第一个。)

有没有办法迫使正则表达式只匹配描述中的第一个“走”?我曾尝试与使它贪婪与非贪婪所概述here尝试,但我不能使它发挥作用。

谢谢。

+0

请告诉我们你的企图使它非贪婪,因为我认为应该这样做。我们需要看看你的尝试,以便我们可以帮助你了解你出错的地方。 – Barmar

+0

Sleafar的答案的工作 - 我试图让“采取”本身不贪婪,而不是之前的字符。谢谢。 – mudfaerie

回答

0

这里尝试更换贪婪部分:

.*take 

与非贪婪版本:

.*?take 

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