您提出了两个问题,识别/提取数量表达式(语法)并弄清楚它们的含义(语义)。
在你弄清楚正则表达式是否足以认出对于数量,您应该为自己建立一个良好的架构(语法)来了解它们的外观。你的例子看起来像这样:
<amount> <unit> [of <ingredient>]
where <amount>
可以采取多种形式:
whole or decimal number, in digits (250, 0.75)
common fraction (3/4)
numeral in words (half, one, ten, twenty-five, three quarters)
determiner instead of a numeral ("an onion")
subjective (some, a few, several)
金额也可以表示为两个简单的范围<amount>
s:
two to three
2 to 3
2-3
five to 10
然后你就有了单位本身:
general-purpose measurements (lb, oz, kg, g; pounds, ounces, etc.)
cooking units (Tb, tsp)
informal units (a pinch, a dash)
container sizes (package, bunch, large can)
no unit at all, for countable ingredients (as in "three lemons")
最后,有一种特殊情况的表达式永远不能与金额或单位组合,因此它们有效地充当两者的组合:
a little
to taste
我建议将其视为一个小型解析器,您可以根据需要将其制作得尽可能详细或粗糙。如果这是您选择的工具,那么为所有这些编写正则表达式应该不会太难,但正如您所见,这不仅仅是文本替换的问题。将零件拉出来并将每种成分表示为三元组(amount, unit, ingredient)
。 (对于可数,使用特殊单位“件”或其他单位;对于“一点”之类的,我将它们视为特殊单位)。
这就留下了一个问题转换或比较数量。很多地方都进行了单位换算,因此至少对于官方单位,您应该可以轻松获取换算表。例如,如果您输入“将 4 盎司转换为克”,Google 就会执行此操作。请注意,一汤匙是三茶匙或四茶匙 http://www.asknumbers.com/TablespoonToTeaspoon.aspx,取决于国家/地区。
对于明确定义的单位,您可以很容易地标准化为您最喜欢的单位,但非正式单位有点棘手。对于“捏”、“破折号”等,我建议找出大概的重量,以便您可以正确缩放(十捏 = 2 克,或其他)。罐头之类的东西是没有希望的,除非你能查到特定产品的尺寸。
另一方面,主观量是最简单的:如果你将“品尝”扩大十倍,它仍然是“品尝”!
最后一个想法:还需要某种成分数据库认识主要成分,因为大小很重要:“一个鸡蛋”可能不是主要成分,但“一只小山羊,切成四等分”很可能是。我会考虑将其用于版本 2。