1

我试图只抓住这条字符串的 1 条:

Serving Size: 1 cup, halves, Calories: 48.6, Fat: 0.5g, Carbs: 11.7g, Protein: 1g

和许多其他人喜欢它。虽然每个字符串都会有不同的变量。例如,上面的字符串可能如下所示:

Serving Size: 100 oz, Calories: 48.6, Fat: 0.5g, Carbs: 11.7g, Protein: 1g

等等...

所以,我现在只尝试获取字符串的“oz”或“cup”部分。

我尝试过的正则表达式看起来像这样:

(?<=Serving Size:\s\d*\s)

尽管在rubular中它一直说“无效”。

虽然如果我这样做

(?<=Serving Size:)\s\d*\s

它将完美匹配数字......我正在尝试排除数字并匹配度量类型。

我怎样才能做到这一点?

4

3 回答 3

6

这个如何?

s = "Serving Size: 1 cup, halves, Calories: 48.6, Fat: 0.5g, Carbs: 11.7g, Protein: 1g"

regex = /Serving Size:\s*(?<amount>\d+)\s*(?<units>\w+)/

m = s.match(regex) # => #<MatchData "Serving Size: 1 cup" amount:"1" units:"cup">
m['units'] # => "cup"
m['amount'] # => "1"
于 2013-10-16T15:43:47.527 回答
1

注意:这回答了为什么正则表达式不起作用。Sergio Tulentsev 的回答已经为如何获得所需结果提供了一个很好的解决方案。

如果我正确地解释了您的意图,(?<=Serving Size:\s\d*\s)是后视,我假设后面是\w+或与测量单位名称相匹配的东西。您的后视(并且原因(?<=Serving Size:)确实有效)的问题在于,与前瞻不同,后视必须具有定义的长度 - 包括\d*导致它是不确定的。

我的建议是捕获单位,然后从结果中获取所需的信息。就像是

/Serving Size:\s\d*\s(\w+)/
于 2013-10-16T15:51:56.193 回答
1
/Serving Size: (.+), Calories: (.+), Fat: (.+), Carbs: (.+), Protein: (.+)/

使用捕获组,然后使用$1$2$3等访问它们。

于 2013-10-17T01:29:22.740 回答