我对正则表达式还是个新手,希望能得到同行的反馈。它将在我的网站上大量使用,所以任何奇怪的边缘情况都可能会造成严重的破坏。这个想法是输入食谱中某种配料的数量,可以是整数或分数。由于我的自动完成机制,只输入数字也是有效的(因为它会弹出下拉菜单)。以下是有效的行:
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].*)$
注意,我正在以不区分大小写的模式运行此操作。以下是我的问题:
这个表达式能否改进?我有点不喜欢数字、分数、复合分数的“或”列表,但我想不到一种方法来允许整数、分数或复合分数。
如果我可以为数值组件后面的每个单词返回一个组,那就太好了。例如 (10 3/4) 的一组,(cups) 的一组和 (sliced) 的一组。后面可以有任意数量的单词。这可能吗?