Что ж, мне кажется, что вам вообще не нужны условия ИЛИ (но см. Ниже).
Для числового бита, вы можете сойти с:
\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 salt
и a handful of sultanas
. Я лично думаю, что вы можете быть ограничены в том, что вы позволите. У меня было бы поле свободной формы для количества и раскрывающийся список для типа продуктов питания (фактически, я бы, вероятно, просто разрешил бы использовать произвольную форму для лота, если бы я не предлагал возможность поиска рецептов на основе того, что находится в холодильнике).