Возможно ли когда-либо иметь группу без захвата, которую нельзя заменить на [...]?
Конечно, когда подстроки вы хотитеmatch - это не отдельные символы, например:
^(?:foo|bar)+$
Это будет соответствовать строке типа foobarbar
. Делать то же самое, используя только набор символов, было бы невозможно.
(?:7|8|9)
Vs -
(7|8|9)
Группа захвата должна использоваться всякий раз, когда вы нужно чтобы захватить текст и использовать его позже. Например, если вы хотите проверить совпадение и извлечь сопоставленную группу, или если вы хотите сделать обратную ссылку на сопоставленную группу позже в шаблоне.
В противном случае группа захвата не имеет смысла и не захватывает группуследует использовать вместо этого.
Использование группы захвата, когда группа без захвата работала бы нормально, имеет 2 проблемы:
- Это вычислительно дороже, так как движок регулярных выражений должен сохранятьотслеживание подобранной группы (несмотря на то, что в этом нет необходимости)
- Это затрудняет понимание замысла шаблона с первого взгляда. Когда кто-то, читающий регулярное выражение, видит группу без захвата, он может быть уверен , что группа используется только для реализации определенной логики (например, повторения или чередования), но то, что сопоставляется, не соответствуетдолжны быть отслежены на потом. Напротив, если читатель регулярного выражения видит захватывающую группу , он, вероятно, будет ожидать, что захватывающая группа будет использоваться позже, и должен будет помнить об этом при чтении остальной части шаблона. Если захваченная группа фактически никуда не привыкла, это лишние когнитивные издержки.