Console.WriteLine("Digite o texto do recibo:");
string texto = Console.ReadLine()!;
string regex = @"R\$ \d+,\d{2}";
string valor = Regex.Match(texto, regex).Value;
Console.WriteLine("Valor encontrado: " + valor);
Console.WriteLine("Digite o texto do recibo:");
string texto = Console.ReadLine()!;
string regex = @"R\$ \d+,\d{2}";
string valor = Regex.Match(texto, regex).Value;
Console.WriteLine("Valor encontrado: " + valor);
Olá, Eduardo. Como vai?
Parabéns pela resolução do exercício! O seu código está muito bem escrito, direto ao ponto e cumpre perfeitamente o objetivo de capturar o valor monetário formatado.
A sua Expressão Regular (Regex) @ "R\$ \d+,\d{2}" demonstra que você captou muito bem as regras de escape e os quantificadores. Vamos analisar a engenharia do padrão que você construiu:
R\$: O cifrão ($) é um caractere reservado na Regex (usado para indicar o fim de uma linha). Ao colocar a barra invertida antes (\$), você avisou ao C# que queria buscar o caractere literal do cifrão. Perfeito!\d+: O token \d busca dígitos numéricos, e o modificador + (um ou mais) garante que o código vai capturar o valor inteiro, independentemente de o produto custar R$ 5, R$ 50 ou R$ 5000.,\d{2}: Mapeia a vírgula seguida de exatamente dois dígitos para os centavos.Para visualizar graficamente como o motor de Regex do .NET faz o casamento de padrões (pattern matching) no seu texto, o fluxo de varredura funciona exatamente assim:
O seu código está funcionando perfeitamente para os testes onde o usuário digita um texto que realmente contém um preço (como "O recibo deu R$ 45,90").
Contudo, no dia a dia do mercado de trabalho, o software pode receber textos mal formatados, digitalizações borradas de notas fiscais (OCR) ou o usuário pode simplesmente esquecer de digitar o valor. Se você rodar o programa e digitar "O recibo foi pago ontem à tarde", o método Regex.Match() não encontrará nenhuma correspondência.
Quando isso acontece, a propriedade .Value retorna uma string vazia (""). Embora não quebre o programa imediatamente, mostrar na tela Valor encontrado: em branco pode confundir quem está operando o sistema.
Como boa prática para tornar o seu script robusto e à prova de falhas, você pode utilizar a propriedade .Success da classe Match para validar se algo foi encontrado antes de exibir o resultado:
using System.Text.RegularExpressions;
Console.WriteLine("Digite o texto do recibo:");
string texto = Console.ReadLine()!;
string regex = @"R\$ \d+,\d{2}";
// Salvamos o objeto do Match primeiro
Match resultado = Regex.Match(texto, regex);
// Verificamos se a busca teve sucesso
if (resultado.Success)
{
Console.WriteLine("Valor encontrado: " + resultado.Value);
}
else
{
Console.WriteLine("Nenhum valor monetário no padrão 'R$ 0,00' foi localizado no texto.");
}
Adicionar essas camadas de validação é o que diferencia um código de testes de um software pronto para rodar em produção em grandes empresas.
Você está com um ritmo excelente na trilha de C#. Continue focado e exercitando a sua mente com as expressões regulares!
Espero que possa ter lhe ajudado!