我有点儿是正则表达式的新手,所以会对这一点的同行反馈表示赞赏。它会在我的网站上大量使用,所以任何奇怪的边缘情况都可能造成严重破坏。这个想法是在整个单位或分数中输入一定量的配料。由于我的自动完成机制,只有一个数字也是有效的(因为它会弹出一个下拉菜单)。这些线是有效的:任何方式来改善这个正则表达式?
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].*)$
注意,我在不区分大小写的模式下运行这一点。这里是我的问题:
表达式可以改进吗?我有点不喜欢数字,分数,复合分数的“OR”列表,但我想不出一种允许整数,分数或复合分数的方法。
如果我可以在数字组件之后为每个单词返回一个组,那将会非常好。如(10 3/4)组,(杯子组)和(切片组)组。之后可以有任何数量的单词。这可能吗?
谢谢!
哦,糟糕,错过了一个例子..金额可以用十进制表示。所以我又添加了一个OR子句:012 \ \ \ \ \ \ \ \ \ \ ($ | [az]。*)$ – 2010-08-23 01:13:08