У вас есть три варианта:
- Вы можете перечислить все возможные заказы. Для 3 переменных есть 6 возможностей. Очевидно, это не масштабируется;
- Вы можете принять возможные дубликаты; или
- Вы можете разбить строку и затем проанализировать ее.
(2) означает что-то вроде:
/(\b(price|category|merchant)=(...).*?)*/
Реальная проблема, с которой вы здесь сталкиваетесь, заключается в том, что вы пытаетесь проанализировать то, что по сути является нерегулярным языком, с регулярным выражением. Регулярное выражение описывает DFSM (детерминированный конечный автомат) или DFA (детерминированный конечный автомат). Обычные языки не имеют понятия состояния, поэтому выражение не может «запомнить», что еще было.
Чтобы добраться до этого, вам нужно добавить «память», обычно в виде стека, в результате чего получается КПК (автомат нажатия).
Это точно та же проблема, с которой сталкиваются люди, когда они пытаются анализировать HTML с регулярными выражениями и зацикливаются на проблемах с вложением тегов и т. П.
В основном вы принимаете некоторые граничные условия (например, повторяющиеся значения), разделяете строку запятыми, а затем анализируете, или вы просто используете неправильный инструмент для задания.