Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Regex.Match retornando errado.

Quando executo a linha 1, imprime corretamente o número de CPF. Porém, quando executo o código 2, o console exibe somente "Me".

O que eu fiz foi adicionar o quantificador {0,3} no terceiro bloco do CPF e {0,2} no último. Mas por quê essa mudança não retorna corretamente?

1  string padrao = "[0-9]{0,3}.?[0-9]{0,3}.?[0-9]{3}-?[0-9]{2}";

2  string padrao = "[0-9]{0,3}.?[0-9]{0,3}.?[0-9]{0,3}-?[0-9]{0,2}";

string textoDeTeste = "Meu nome é Igor, meu cpf é 123.456.789-10";

Match resultado = Regex.Match(textoDeTeste, padrao);

Console.WriteLine(resultado.Value);

1 resposta
solução!

Igor, bom dia.

Primeiro tem um problema no seu padrão: o caracter ponto (.) numa expressão regular é reconhecido como qualquer caracter. Veja informações aqui.

Então mudei seus patterns para...

"[0-9]{0,3}\\.?[0-9]{0,3}\\.?[0-9]{3}-?[0-9]{2}"
"[0-9]{0,3}\\.?[0-9]{0,3}\\.?[0-9]{0,3}-?[0-9]{0,2}"

...respectivamente.

Segundo, repare que o último padrão captura qualquer string vazia, uma vez que tudo pode ser opcional! Daí não é que vc não pegou o CPF, ele simplesmente não é a primeira captura! O método Match() faz isso: pega a primeira ocorrência. Se você buscar todas as ocorrências verá que o CPF foi capturado.

Experimente o seguinte código:

string padrao1 = "[0-9]{0,3}.?[0-9]{0,3}.?[0-9]{3}-?[0-9]{2}";
string padrao2 = "[0-9]{0,3}\\.?[0-9]{0,3}\\.?[0-9]{0,3}-?[0-9]{0,2}";

string textoDeTeste = "Meu nome é Igor, meu cpf é 123.456.789-10";

var resultado = Regex.Matches(textoDeTeste, padrao2);
foreach (Match match in resultado)
{
    Console.WriteLine(match.Value);
}

Você verá que o CPF será uma das últimas ocorrências!

Espero que tenha ajudado.

Abraços!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software