Можно ли объединить эти два выражения регулярных выражений в одно?

У меня есть следующие два regular expressions (в порядке, кстати).

1. ^~/buying/(.*)\?(.*)   => foo= group 1  baa= group 2.
2. ^~/buying/(.*)         => foo= group 1  baa= nothing/empty/null/baibai

То, что я пытаюсь сделать, если URL имеет вопросительный знак, а затем разделить его на две группы. В противном случае, просто бросьте все вещи в первую группу.

причина, по которой порядок важен для меня, заключается в том, что если я переключу их, "?" Регулярное выражение никогда не будет запущено, потому что выражение #2 (выше) перехватит все.

Итак... это можно исправить?

ПРИМЕЧАНИЕ: я пытался использовать этот сайт**, чтобы помочь мне отладить / настроить... но я не могу понять это.

** У меня нет связи с этим сайтом.

3 ответа

Решение

Попробуй это:

^~/buying/([^?]*)\??(.*)

([^?]*) - Захватывает первую группу, в которой нет знака вопроса.
\?? - Необязательный знак вопроса.
(.*) - Необязательная вторая группа - может быть пустой.

Как насчет того, чтобы сделать вторую часть необязательной (непроверенной):

^~/buying/([^\?]*)(?:\?(.*))?

?: чтобы предотвратить захват необязательной части (нужной вам части плюс знак вопроса).

Изменить: Из-за жадности, вам нужно использовать либо отрицательный класс символов [^\?], Либо сделать его ленивым. (Отрицательный символьный класс предпочтителен, потому что он уменьшает возврат).

Также вы можете присоединиться, как это, легче понять.

^~/buying/(.*)(\?(.*))?$

Другие вопросы по тегам