Есть проблемы с пониманием захвата групп и обратных ссылок

Желая навести порядок в своих знаниях о регулярных выражениях, я решил просмотреть книгу о них " Введение в регулярные выражения". И я знаю, что это глупо, но один из вводных примеров не имеет смысла для меня.

(\d)\d\1

Пример текста:

123-456-7890

(должен захватить первый номер, 123)

Кто-нибудь может объяснить, что здесь происходит?

Насколько я могу понять, первый \d захватывает число 123. \1 обратные ссылки (отметки) группы для последующего использования. Круглые скобки ограничивают область действия группы. Но что делает второй \d делает?

Простое объяснение, как для маленького ребенка или золотистого ретривера, предпочтительнее.

2 ответа

Решение

\d это просто одна цифра.

Это регулярное выражение не соответствует "123-456-7890" строка, но она будет соответствовать "323" (который может быть частью большей строки, например "323-456-7890"):

 (\d) : first digit ("3")
 \d   : another digit ("2")
 \1   : first group (which was "3")

Теперь, если ваша книга притворяется, что (\d)\d\1 должен захватить "123" в "123-456-7890", тогда это может содержать ошибку...

(\d)\d\1 шаг за шагом:

  1. Первый \d соответствует одной цифре
  2. И скобки () пометьте это как группу захвата - это первая группа, поэтому цифра запоминается как "группа 1"
  3. Второй \d говорит, что есть другая цифра
  4. \1 говорит "вот значение из нашей предыдущей группы 1" - это цифра, которая была сопоставлена ​​на шаге 1.

Итак, как уже сказал дистрой: регулярное выражение должно соответствовать последовательности из трех цифр, из которых первая и третья равны.

Другие вопросы по тегам