2010-08-23 80 views
6

我有点儿是正则表达式的新手,所以会对这一点的同行反馈表示赞赏。它会在我的网站上大量使用,所以任何奇怪的边缘情况都可能造成严重破坏。这个想法是在整个单位或分数中输入一定量的配料。由于我的自动完成机制,只有一个数字也是有效的(因为它会弹出一个下拉菜单)。这些线是有效的:任何方式来改善这个正则表达式?

1 
1/2 
1 1/2 
4 cups 
4 1/2 cups 
10 3/4 cups sliced 

该行的数字部分应该是其自己的组,所以我可以解析与我的分数解析器。数字部分之后的所有内容都应该是第二组。起初,我尝试这样做:

^\s*(\d+|\d+\/\d+|\d+\s*\d+\/\d+)\s*(.*)$ 

这几乎工作,但 “1个1/2杯具” 将得到解析:(1)(1/2杯),而不是(1 1/2)和(杯)。我挠了一下脑后,我确定这是因为我的“OR”子句的顺序。 (1)满足\ d +并且(。*)满足其余。所以我改变了这个:

^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*([a-z].*)$ 

这几乎可以工作,但允许奇怪,如“1 1/2/4杯”或“1/2 3杯”。所以,我决定一个有效的数值表达式后执行一个字母作为第一个字符:

^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*($|[a-z].*)$ 

注意,我在不区分大小写的模式下运行这一点。这里是我的问题:

  1. 表达式可以改进吗?我有点不喜欢数字,分数,复合分数的“OR”列表,但我想不出一种允许整数,分数或复合分数的方法。

  2. 如果我可以在数字组件之后为每个单词返回一个组,那将会非常好。如(10 3/4)组,(杯子组)和(切片组)组。之后可以有任何数量的单词。这可能吗?

谢谢!

+0

哦,糟糕,错过了一个例子..金额可以用十进制表示。所以我又添加了一个OR子句:012 \ \ \ \ \ \ \ \ \ \ ($ | [az]。*)$ – 2010-08-23 01:13:08

回答

3

好吧,在我看来,你根本不需要OR条件(但见下文)。

对于数字位,你可以逃脱:

\d+(\s+\d+/\d+) 

这将处理所有的分数值。

我仍然保持你的十进制与OR子句分开,因为它可能会使事情变得复杂。所以,我认为你很可能喜欢的东西逃脱:

^\s*((\d+\s)?(\d+/\d+)?|\d+(\.\d+)?)\s*([a-z].*)?$ 
| |     |   | | 
| |     |   | +--- start of alpha section. 
| |     |   +------ optional white space. 
| |     +------------------ decimal (nn[.nn]) 
| +------------------------------------- fractional ([nn ][nn/nn]) 
+----------------------------------------- optional starting space. 

虽然允许一个空闲的部分金额,所以你可能是你已经有了(整体,分数和小数中分离或条款)更好。

我喜欢([a-z].*)?$结构来($|[a-z].*)$自己,但可能只是我的过去讨厌在我的RE多行结束标记:-)


但是,实话实说,我想你可能试图在这里用热核弹头击打苍蝇。

您是否确实需要限制输入内容。我见过要求a pinch of salta handful of sultanas的食谱。我个人认为你可能会限制你允许的内容。我会有一个自由形式的数量领域和一个食物类型的下拉菜单(实际上,除非我提供基于冰箱中的内容搜索食谱的能力,否则我可能只允许自由格式的食物)。

+0

也许我们正在使用不同的解析器,但是这与我上面的任何示例都不匹配。但是我想我会看到你想用问号做什么。 – 2010-08-23 01:30:07

+0

@Mike,我不喜欢使用Javascript RE引擎,但我希望这些描述性内容能让我更好地理解这个想法。 – paxdiablo 2010-08-23 01:36:51

+0

是的,看着你的表情我认为它应该可以工作,但由于某种原因,它不:)我使用RegExTester.com来测试事情。 – 2010-08-23 01:41:20

1

我认为,这正则表达式应该做你想要什么:

/^\s*(\d+ \d+\/\d+|\d+\/\d+|\d+)\s*(.*)/ 

匹配特定的话,你应该只是做空格分割解析之后。有一件事你不想用正则表达式;)

+0

是的工作,只有没有十进制支持..和我改变(。*)为([az]。*)摆脱像1/2/cups .. – 2010-08-23 01:36:40

+0

其实可能($ | [az]。* )更好,因为我不想在数字部分之后要求任何东西。 – 2010-08-23 01:38:05

+0

啊是的。如果你想要小于''\ d。] +'应该用'代替。如果您想添加复杂的规则,很难将其完全保存在一个正则表达式中。 – Wolph 2010-08-23 01:45:34