Что делает (?: Делать в регулярном выражении

Я столкнулся с регулярным выражением, которое я не совсем понимаю - может ли кто-нибудь помочь мне в его расшифровке:

^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.