?: Обозначения в регулярном выражении

для одного из моих классов я должен описать следующее регулярное выражение:

\b4[0-9]{12}(?:[0-9]{3})\b

Я понимаю, что он выбирает число, которое: начинается с 4, сопровождается 12 цифрами (каждая от 0 до 9) и сопровождается еще 3 цифрами.

Что я не понимаю, так это вопросительный знак с точкой с запятой (?:....). Я пытался посмотреть в Интернете, чтобы выяснить, что это значит, но ссылки, которые я нашел, были несколько запутанными; Я надеялся, что кто-нибудь может дать мне краткое представление о том, что делает знак вопроса в этом примере.

Ответ 1

Это будет короткий ответ.

При использовании (?:) это означает, что group сопоставляется, но не записывается для обратной ссылки i.e не захватывающей группы. Он не хранится в памяти для ссылки позже.

Например:

(34)5\1

Это регулярное выражение означает, что вы ищете 34, а затем 5, а затем снова 34. Определенно вы можете записать его как 34534, но иногда captured group представляет собой сложный шаблон, который вы не могли предсказать заранее.

Значит независимо сопоставляется группа захвата.

Демо-версия Regex101 для обратных ссылок


Обратная ссылка также используется при замене.

Пример:

([A-Z]+)[0-9]+

Это регулярное выражение будет искать many строчные буквы, за которыми следуют цифры many. И я хочу заменить весь этот шаблон только найденными строчными буквами.

Затем я бы заменил весь шаблон, используя \1, который обозначает обратную ссылку первая захваченная группа.

демо Regex101 для замены

Если вы перейдете на (?:[A-Z]+)[0-9]+, это больше не будет зафиксировать и, следовательно, не может быть возвращено.

Демо-версия Regex101 для группы, не участвующей в захвате

Живой ответ.

Ответ 2

Он называется "не захватывающей группой", что означает, что регулярное выражение не будет создавать группу по совпадению внутри родительских элементов, как в противном случае (обычно, скобка создает группу).