Скажем, у вас есть строка, abcabc
, и вы хотите, чтобы выяснить, соответствует ли первая часть строки второй части. Вы можете сделать это с помощью одного регулярного выражения, используя группы захвата и обратные ссылки. Вот регулярное выражение я хотел бы использовать:
(.+)\1
Путь это работает .+
соответствует любой последовательности символов. Потому что это в скобках, это пойман в группе. \1
является backreference группе захвата 1
, поэтому это эквивалент текста, захваченного группой захвата. После небольшого отступа, группа захвата совпадает с первой частью строки, abc
. Обратная ссылка \1
теперь эквивалентна abc
, поэтому она соответствует второй половине строки. Вся строка теперь сопоставляется, поэтому подтверждается, что первая половина строки соответствует второй половине.
Другое использование обратных ссылок в замене. Скажем, вы хотите заменить все {...}
на [...]
, если текст внутри {
и }
- это всего лишь цифры. Вы можете легко сделать это с помощью захвата групп и обратные ссылки, используя регулярные выражения
{(\d+)}
И заменяя, что с [\1]
.
Регулярное выражение соответствует {123}
в строке abc {123} 456
и фиксирует 123
в первой группе захвата. Обратная связь \1
теперь эквивалентна 123
, поэтому замена {(\d+)}
на abc {123} 456
с [\1]
приводит к abc [123] 456
.
Причина, по которой группы, не связанные с захватом, существуют потому, что группы в целом имеют больше применений, которые просто захватывают. Регулярное выражение (xyz)+
соответствует строке, целиком состоящей из группы, xyz
, повторяющейся, например xyzxyzxyz
. Требуется группа, потому что xyz+
соответствует только xy
, а затем z
повторяется, то есть xyzzzzz
. Проблема с использованием групп захвата заключается в том, что они относительно неэффективны по сравнению с группами, не связанными с захватом. Регулярное выражение (?:xyz)+
найдет матч намного раньше, чем (xyz)+
, потому что группе не нужно помнить, что это соответствовало.
Надеюсь, это поможет!
Спасибо, Райан. Примеры были очень полезными. Благодаря тонну. – benz