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, podemos extrair a data desejada. Mas, e se quisermos obter os componentes individuais da data, como o ano, o mês e o dia? Nesse caso, podemos usar grupos.

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})/ contém três grupos. O primeiro grupo (\d{4}) consiste em quatro dígitos e representa o ano. O segundo e o terceiro grupos (\d{2}) consistem em dois dígitos cada e representam o mês e o dia, respectivamente.

Se observarmos o resultado do método exec, veremos que além da correspondência com a data completa, ele inclui correspondências para cada grupo:

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)+ representa uma ou mais repetições da string "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, que representa um objeto contendo os valores para cada grupo nomeado.

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 =, segue o padrão que deve preceder a substring.

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 !, segue o padrão que NÃO deve preceder a substring.

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 (?<=\$) indica que antes da string deve haver um símbolo de dólar $. Se não houver, o método exec() não encontrará correspondências e retornará null.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com