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 posts
seguida por uma barra /
e algo id
assim:
posts/id
Linguagem 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/100
Linguagem 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 Groups
propriedade do Match
objeto. O tipo de Groups
é o GroupCollection
tipo que é uma coleção de Group
objetos.
O primeiro elemento da Groups
coleção é toda a correspondência que está posts/100
neste 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 id
da 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
100
Linguagem 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
31
Linguagem 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 Groups
propriedade, 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 Groups
propriedade 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/31
Linguagem de código: C# ( cs )
Resumo
- Coloque um padrão entre parênteses
()
para criar um grupo de captura. - Use a
Match.Groups
propriedade 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 atribuirname
a um grupo de captura e acessar seu valor correspondente usandoGroups["name"]
.