Grupos de captura na própria expressão regular em JavaScript
O conteúdo dos grupos de captura não está disponível apenas na string de substituição, mas também na própria expressão regular: nós podemos colocar algo em um grupo de captura e então, diretamente na expressão regular, indicar que o conteúdo desse grupo de captura deve aparecer aqui.
O conteúdo dos grupos de captura está disponível por seus números,
precedidos por uma barra invertida. Por exemplo,
o primeiro grupo de captura estará disponível assim: \1,
o segundo grupo de captura assim - \2, o terceiro
- \3 e assim por diante.
Estou certo de que tudo escrito acima ainda é bastante vago para você. Isso não é surpreendente, pois os grupos de captura são o aspecto mais difícil de entender das expressões regulares. Vamos entender com exemplos.
Exemplo
Suponha que temos a seguinte string:
let str = 'aa bb cd ef';
Vamos encontrar nela todos os locais onde existem duas letras iguais consecutivas. Para resolver o problema, vamos procurar qualquer letra, colocá-la em um grupo de captura e, em seguida, verificar se o próximo caractere é o conteúdo desse grupo de captura:
let res = str.replace(/([a-z])\1/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! ! cd ef'
Exemplo
Suponha que temos a seguinte string:
let str = 'asxca buzxb csgd';
Vamos encontrar nela todas as palavras em que a primeira e a última letras são iguais. Para resolver o problema, escreveremos o seguinte padrão: uma letra, seguida por uma ou mais letras, e então a mesma letra que a primeira:
let res = str.replace(/([a-z])[a-z]+\1/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! ! csgd'
Problemas práticos
Dada a string:
let str = 'aaa bbb ccc xyz';
Encontre todas as substrings que contêm três letras iguais consecutivas.
Dada a string:
let str = 'a aa aaa aaaa aaaaa';
Encontre todas as substrings que contêm duas ou mais letras iguais consecutivas.
Dada a string:
let str = 'aaa aaa bbb bbb ccc ddd';
Encontre todas as substrings que contêm duas palavras iguais consecutivas.