Что делает (?: Делать в регулярном выражении
Я столкнулся с регулярным выражением, которое я не совсем понимаю - может ли кто-нибудь помочь мне в его расшифровке:
^home(?:\/|\/index\.asp)?(?:\?.+)?$
Он используется в сопоставлении URL-адресов, и приведенный выше пример соответствует следующим URL-адресам:
home
home/
home/?a
home/?a=1
home/index.asp
home/index.asp?a
home/index.asp?a=1
Мне кажется, что вопросительные знаки в скобках (?:
ничего не делают. Может кто-нибудь просветить меня.
Используемая версия регулярного выражения - это тот, который поставляется с классическим ASP и запускается на сервере, если это вообще помогает.
Ответы
Ответ 1
(?:)
создает группу без захвата. Он объединяет вещи, не создавая обратной ссылки.
Обратная ссылка - это часть, которую вы можете найти в выражении или возможной замене (обычно, говоря \1
или $1
и т.д. - в зависимости от вкуса). Вы также можете обычно извлекать их из соответствия после использования regex на языке программирования. Единственная причина использования (?:)
заключается в том, чтобы избежать создания новой обратной ссылки, которая позволяет избежать увеличения номера группы и сохраняет (как правило, незначительную величину) память
Ответ 2
Это группа без захвата, которая по существу совпадает с использованием (...)
, но содержимое не сохраняется (недоступно в качестве обратной ссылки).
Если вы делаете что-то вроде этого: (abc)(?:123)(def)
Вы получите abc
в $1
и def
в $2
, но 123
будет только соответствовать.
Ответ 3
это действительно легко
каждая скобка создаст переменную в памяти, чтобы вы могли использовать значение скобок впоследствии, чтобы не сохранять его в памяти, просто поместите:? в скобках, как это (? :), а затем заполните все остальное, как вам нужно.
что это и ничего больше
Ответ 4
Из документации:
(?:...)
A non-capturing version of regular parentheses. Matches whatever regular expression is inside the parentheses, but the substring matched by the group cannot be retrieved after performing a match or referenced later in the pattern.