Grupos Regex C#

Resumo : neste tutorial, você aprenderá sobre a captura de grupos e como usar a propriedade C# Regex Groups para obter as correspondências.

Introdução aos grupos C# Regex

Suponha que você queira corresponder uma rota que começa com postsseguida por uma barra /e algo idassim:

posts/idLinguagem de código:  C#  ( cs )

Para fazer isso, você pode criar o seguinte padrão de expressão regular:

posts/\d+

E o programa a seguir ilustra como você usaria esse padrão para corresponder à rota:

using System.Text.RegularExpressions;
using static System.Console;


var route = "posts/100";
var pattern = @"posts/\d+";

var match = Regex.Match(route, pattern);

WriteLine(match.Value);Linguagem de código:  C#  ( cs )

Saída:

posts/100Linguagem de código:  C#  ( cs )

O padrão posts/\d+corresponde aos posts/caracteres e é seguido por um ou mais dígitos. Ele retorna o resultado conforme o esperado.

Agora você deseja extrair o id da rota, que neste caso é 100. Para fazer isso, você pode usar algo chamado grupo de captura em expressões regulares.

Por definição, um grupo de captura permite capturar uma parte do texto correspondente. Para criar um grupo de captura, você define um subpadrão dentro do padrão geral e fecha-o entre parênteses.

Em nosso exemplo, podemos criar um subpadrão como este:

posts/(\d+)Linguagem de código:  C#  ( cs )

Este (\d+)é um grupo de captura e \d+é um subpadrão.

Se as correspondências forem encontradas, você poderá acessar os grupos através da Groupspropriedade do Matchobjeto. O tipo de Groupsé o GroupCollectiontipo que é uma coleção de Groupobjetos.

O primeiro elemento da Groupscoleção é toda a correspondência que está posts/100neste exemplo e os próximos elementos são o texto correspondente dos grupos de captura.

O exemplo a seguir usa o grupo de captura para extrair o valor idda rota posts/100:

using System.Text.RegularExpressions;
using static System.Console;

var route = "posts/100";
var pattern = @"posts/(\d+)";

var match = Regex.Match(route, pattern);

if (match.Success)
{
    foreach (var group in match.Groups)
    {
        WriteLine(group);
    }
}Linguagem de código:  C#  ( cs )

Saída:

posts/100
100Linguagem de código:  C#  ( cs )

Uma expressão regular pode conter vários grupos de captura. Por exemplo:

using System.Text.RegularExpressions;
using static System.Console;


// posts/year/month/date format
var route = "posts/2023/12/31";

var pattern = @"posts/(\d{4})/(\d{2})/(\d{2})";

var match = Regex.Match(route, pattern);

if (match.Success)
{
    foreach (var group in match.Groups)
    {
        WriteLine(group);
    }
}Linguagem de código:  C#  ( cs )

Saída:

posts/2023/12/31
2023
12
31Linguagem de código:  C#  ( cs )

Neste exemplo, temos três grupos de captura para ano, mês e data na rota. A saída mostra quatro grupos, que incluem toda a partida.

Grupos de captura nomeados

Ao usar a Groupspropriedade, você pode iterar os grupos ou acessar um grupo por índice. Por exemplo, o Groups[1]deve retornar o ano que é 2023:

using System;
using System.Text.RegularExpressions;
using static System.Console;


// posts/year/month/date format
var route = "posts/2023/12/31";

var pattern = @"posts/(\d{4})/(\d{2})/(\d{2})";

var match = Regex.Match(route, pattern);

if (match.Success && match.Groups.Count == 4)
{
    var year = match.Groups[1];
    var month = match.Groups[2];
    var day = match.Groups[3];
    WriteLine($"{year}/{month}/{day}");
}Linguagem de código:  JavaScript  ( javascript )

É mais explícito atribuir um nome a cada captura na expressão regular para que possamos acessar cada grupo por nome e não por índice.

Para fazer isso, você pode usar a seguinte sintaxe:

(?<name>rule)Linguagem de código:  C#  ( cs )

Nesta sintaxe:

  • O ()denota um grupo de captura.
  • Especifica o ?<name>nome do grupo de captura.
  • O ruleé um subpadrão.

Para acessar o valor correspondente, procure-o na Groupspropriedade pelo nome do grupo assim:

Groups["name"]Linguagem de código:  C#  ( cs )

Por exemplo:

using System.Text.RegularExpressions;
using static System.Console;


// posts/year/month/date format
var route = "posts/2023/12/31";

var pattern = @"posts/(?<year>\d{4})/(?<month>\d{2})/(?<day>\d{2})";

var match = Regex.Match(route, pattern);

if (match.Success)
{
    var year = match.Groups["year"];
    var month = match.Groups["month"];
    var day = match.Groups["day"];
    WriteLine($"{year}/{month}/{day}");

}Linguagem de código:  C#  ( cs )

Saída:

2023/12/31Linguagem de código:  C#  ( cs )

Resumo

  • Coloque um padrão entre parênteses ()para criar um grupo de captura.
  • Use a Match.Groupspropriedade para acessar os grupos. O primeiro grupo é a partida inteira e os próximos são os grupos combinados.
  • Use a (?<name>rule)sintaxe para atribuir namea um grupo de captura e acessar seu valor correspondente usando Groups["name"].

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *