1
resposta

[Projeto] Extraindo o valor de uma moeda

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);
1 resposta

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:


Uma dica de ouro para o mundo real: E se o valor for nulo?

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!