Не захватывающие группы - PullRequest
0 голосов
/ 29 октября 2019

Каков пример того, где вы хотели бы использовать группу без захвата? Здесь:

(?:7|8|9)

Vs -

(7|8|9)

Vs -

[7-9]

Возможно ли когда-либо иметь группу без захвата, которая не можетбыть заменен на [...]?

1 Ответ

1 голос
/ 29 октября 2019

Возможно ли когда-либо иметь группу без захвата, которую нельзя заменить на [...]?

Конечно, когда подстроки вы хотитеmatch - это не отдельные символы, например:

^(?:foo|bar)+$

Это будет соответствовать строке типа foobarbar. Делать то же самое, используя только набор символов, было бы невозможно.

(?:7|8|9)

Vs -

(7|8|9)

Группа захвата должна использоваться всякий раз, когда вы нужно чтобы захватить текст и использовать его позже. Например, если вы хотите проверить совпадение и извлечь сопоставленную группу, или если вы хотите сделать обратную ссылку на сопоставленную группу позже в шаблоне.

В противном случае группа захвата не имеет смысла и не захватывает группуследует использовать вместо этого.

Использование группы захвата, когда группа без захвата работала бы нормально, имеет 2 проблемы:

  • Это вычислительно дороже, так как движок регулярных выражений должен сохранятьотслеживание подобранной группы (несмотря на то, что в этом нет необходимости)
  • Это затрудняет понимание замысла шаблона с первого взгляда. Когда кто-то, читающий регулярное выражение, видит группу без захвата, он может быть уверен , что группа используется только для реализации определенной логики (например, повторения или чередования), но то, что сопоставляется, не соответствуетдолжны быть отслежены на потом. Напротив, если читатель регулярного выражения видит захватывающую группу , он, вероятно, будет ожидать, что захватывающая группа будет использоваться позже, и должен будет помнить об этом при чтении остальной части шаблона. Если захваченная группа фактически никуда не привыкла, это лишние когнитивные издержки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...