Tem dificuldade em entender a captura de grupos e referências de retorno

Desejando colocar alguma ordem no meu conhecimento de expressões regulares, decidi ler um livro sobre elas, Introducing Regular Expressions . E eu sei que é bobo, mas um dos exemplos introdutórios não faz sentido para mim.

(\d)\d\1 

Texto de amostra:

 123-456-7890 

(deve capturar o primeiro número, 123 )

Alguém pode explicar o que está acontecendo aqui?

Tanto quanto eu posso descobrir, o primeiro \d captura o número 123. O \1 backreferences (marcas) o grupo para uso posterior. Os parênteses limitam o escopo do grupo. Mas o que faz o segundo \d ?

Simples explicação, como para uma criança pequena ou um golden retriever são preferidos.

\d é apenas um dígito.

Essa expressão regular não corresponde à string "123-456-7890" mas corresponderia a "323" (que poderia ser parte de uma string maior, por exemplo "323-456-7890" ):

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

Agora, se o seu livro finge que (\d)\d\1 deve capturar "123" em "123-456-7890" , então ele pode conter um erro …

(\d)\d\1 passo a passo:

  1. O primeiro \d corresponde a um dígito
  2. E os parênteses () marcam isso como um grupo de captura – este é o primeiro, então o dígito é lembrado como “grupo 1”
  3. O segundo \d diz que há outro dígito
  4. \1 diz “aqui está o valor do nosso grupo anterior 1” – esse é o dígito que foi correspondido no passo 1.

Então, como dystroy já disse: o regex deve corresponder a uma sequência de três dígitos, dos quais o primeiro e o terceiro são iguais.