Grupos em Expressões Regulares - JavaScript
Definição de Grupos em Expressões Regulares
Para encontrar correspondências mais complexas em uma string, utilizamos grupos. Em expressões regulares, grupos são definidos entre parênteses. Por exemplo, para extrair uma data em um formato específico, podemos usar o método exec() do objeto RegExp para obter a correspondência completa. Suponha que a data esteja no formato "aaaa-mm-dd" (2021-09-06):
const exp = /\d{4}-\d{2}-\d{2}/;
const text = "Publication Date: 2021-09-06"
const result = exp.exec(text);
console.log(result[0]); // 2021-09-06
Do resultado do método exec
Cada grupo representa um segmento da expressão regular que está contido em parênteses. Por exemplo:
const exp = /(\d{4})-(\d{2})-(\d{2})/;
const text = "Publication Date: 2021-09-06"
const result = exp.exec(text);
console.log(result);
// Saída do console
// ['2021-09-06', '2021', '09', '06', index: 18, input: 'Publication Date: 2021-09-06', groups: undefined]
Saída do console:
['2021-09-06', '2021', '09', '06', index: 18, input: 'Publication Date: 2021-09-06', groups: undefined]
Aqui, a expressão regular /(\d{4})-(\d{2})-(\d{2})/
(\d{4})
(\d{2})
Se observarmos o resultado do método exec
console.log(result[0]); // 2021-09-06 - toda a correspondência
console.log(result[1]); // 2021 - primeira grupo
console.log(result[2]); // 09 - segundo grupo
console.log(result[3]); // 06 - terceiro grupo
Obtendo os valores dos grupos individuais, podemos realizar algumas operações com eles, como converter para outro formato de data:
console.log(`${result[3]}.${result[2]}.${result[1]}`); // 06.09.2021
Grupos simplificam a criação de expressões regulares mais complexas. A grupos, assim como a caracteres individuais, podem ser aplicados quantificadores. Por exemplo, a expressão (la)+
Grupos Nomeados
JavaScript permite atribuir um nome a cada grupo em expressões regulares. Com esse nome, posteriormente, podemos obter o valor correspondente a esse grupo. Para nomear um grupo dentro dos parênteses que definem o grupo, colocamos um ponto de interrogação seguido de um nome entre sinais de maior e menor:
(?<nome_do_grupo>...)
Vejamos um exemplo:
const exp = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const text = "Publication Date: 2021-09-06"
const result = exp.exec(text);
console.log(result.groups); // {year: "2021", month: "09", day: "06"}
console.log(result.groups.year); // 2021
console.log(result.groups.month); // 09
console.log(result.groups.day); // 06
Neste exemplo, a expressão regular define três grupos nomeados: "year", "month", e "day". Ao obter o resultado, podemos acessar cada grupo através da propriedade groups
Afirmações
Afirmações, ou assertions, permitem capturar uma substring que corresponde à expressão regular e que é precedida ou não por um determinado padrão.
Uma afirmação positiva (quando a substring deve ser precedida por outra substring) é definida com a expressão:
(?<=...)
Após o sinal de igual =
Uma afirmação negativa (quando a substring NÃO deve ser precedida por outra substring) é definida com a expressão:
(?<!...)
Após o ponto de exclamação !
Por exemplo, se tivermos informações sobre um valor em diferentes moedas:
const text1 = "All costs: $10.53";
const text2 = "All costs: €10.53";
const exp = /(?<=\$)\d+(\.\d*)?/;
const result1 = exp.exec(text1);
console.log(result1); // ["10.53", ".53", index: 12, input: "All costs: $10.53", groups: undefined]
const result2 = exp.exec(text2);
console.log(result2); // null
A afirmação (?<=\$)
exec()
null