Регулярное различие в последовательностях - PullRequest
0 голосов
/ 21 января 2012

Мне не ясно, в чем разница:
(...)
и
(?:...)

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

Я прав? И если это действительно единственное их отличие, зачем нам использовать второй вариант?
Это для производительности?

Ответы [ 4 ]

2 голосов
/ 21 января 2012

Обратные ссылки оказывают удивительно высокое влияние на производительность.Регулярное выражение без обратных ссылок может быть реализовано как DFA, для выполнения которого используется O (string_length).С обратными ссылками это должен быть NFA, который имеет экспоненциальное время выполнения в наихудшем случае (хотя в лучшем случае это может быть довольно быстро).

http://swtch.com/~rsc/regexp/regexp1.html и https://softwareengineering.stackexchange.com/questions/75606/advantages-disadvantages-of-nfa-over-dfa-and-vice-versa имеют некоторые подробности.

2 голосов
/ 21 января 2012

Это правильно.(?:...) на самом деле группа без захвата и не может использоваться для обратной ссылки.Причины, по которым группа без захвата используется, потому что есть много случаев, когда вы хотите сгруппировать определенные сегменты вашего регулярного выражения, но на самом деле не хотите их захватывать.DO:

  • Используйте (...), когда вы хотите сгруппировать сегменты вашего регулярного выражения, и хотите , чтобы захватить группу
  • Используйте (?:...), когда вы хотите сгруппировать свое регулярное выражениесегменты и не хотят захватывать группу
1 голос
/ 21 января 2012

Да, это единственная разница.Производительность и удобочитаемость (т. Е. Ясность вашего намерения) и, возможно, не напрасная трата ссылок (у вас есть только 9) будут причинами использования второго синтаксиса.

1 голос
/ 21 января 2012

Это правильно - производительность - главная причина.Также, когда вы делаете такие вещи, как вложенные группы;Возможно, вы захотите иметь «хорошие» группы захвата для дальнейшего использования, но вам также понадобится группировка для таких вещей, как | операторы.Точно так же, если вы редактируете регулярное выражение, в котором уже есть группы захвата, и вы хотите добавить больше группировки, но не хотите влиять на существующие группы захвата, вы можете аналогичным образом использовать группу без захвата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...