Это может быть недостаточно строго для вас, и если ваши данные сильно отличаются от ваших примеров, это может не сработать, но я сделал удар и предложил следующее регулярное выражение. Это меньше на стороне фантазии и больше на стороне грубой силы.
\b(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+(?:(\#PARAM(?:2|3)\[\\w\+])?(\#PARAM1\[\\w\+])(\#PARAM(?:2|3)\[\\w\+])?|(\#PARAM(?:2|3)\[\\w\+]){0,2}(\#PARAM1\[\\w\+])|(\#PARAM1\[\\w\+])(\#PARAM(?:2|3)\[\\w\+]){0,2})$
Я взял первую часть вашего регулярного выражения, а затем добавил регулярное выражение, которое соответствует трем вариантам, которые соответствуют возможным позициям требуемого параметра PARM1 по отношению к дополнительным параметрам:
- Дополнительный PARM2 / 3, Требуется PARM1, Дополнительный PARM2 / 3
- Дополнительный PARM2 / 3, Дополнительный PARM2 / 3, Требуемый PARM1
- Требуется PARM1, Опционально PARM2 / 3, Опционально PARM2 / 3
Есть некоторые совпадения в альтернативах; возможно, подумав еще, можно было бы немного их упростить.
Как я уже говорил, он может быть недостаточно строгим, поскольку необязательные дополнительные параметры не требуют уникальности. Этот и подобные варианты пройдут:
http://www.google.com # PARAM1 [\ ш +] # Param3 [\ ш +] # Param3 [\ ш +]
Конечно, я не проводил исчерпывающих тестов, поэтому могут быть и другие ошибки, но, возможно, это поможет или даст вам что-то, на что можно опираться.