Tutorial Windows Phone: Validando dados com expressões regulares

On 5 de dezembro de 2014 by Gustavo Quintão

Introdução

Utilizar expressões regulares é um modo simples eficiente de fazer validação de dados de entrada. Neste tutorial ensinaremos a utilizar essas expressões na plataforma Windows Phone. Como exemplo para este tutorial criaremos um validador de data. Embora já existam componentes que fornecem a data validada usaremos este exemplo por ser de simples compreensão e similar a outras situações que podem aparecer no desenvolvimento de um aplicativo.

O aplicativo exemplo será capaz de verificar se o usuário entrou com a data no formato válido e exibira dia, mês e ano separados.

Entrada de data para validação

Entrada de data para validação

O tratamento de validação da expressão regular será feito quando o usuário clicar no botão OK, sendo então o método que trata o clique do botão responsável por conter a expressão regular e submeter o texto do TextBox a validação.

Criando a expressão regular

Antes de mais nada deve-se fazer o import das classes necessárias. Para isso basta adicionar as seguinte linhas ao arquivo que estamos trabalhando:

[sourcecode language=”csharp” wraplines=”false” collapse=”false”]
using System.Text;
using System.Text.RegularExpressions;
[/sourcecode]

O método que faz a validação deve conter a expressão regular em si, além de efetuar a verificação se a entrada casa com a expressão regular, uma versão inicial do nosso método pode ser vista a seguir:

[sourcecode language=”csharp” wraplines=”false” collapse=”false”]
private void OkButton_Click(object sender, RoutedEventArgs e)
{
Regex data_regex = new Regex(@"\d{2}/\d{2}/\d{4}",RegexOptions.IgnoreCase);

if (data_regex.IsMatch(DataBox.Text))
{
MessageBox.Show("Passou");
}
else
{
MessageBox.Show("Não passou");
}
}
[/sourcecode]

Neste método podemos ver a definição da expressão regular, que é dada essencialmente por uma String contendo o padrão que a entrada deve casar. Nessa versão a string deve casar com dois dígitos seguidos por barra, seguida por dois dígitos e novamente barra, e para finalizar mais 4 dígitos. Na expressão abaixo

@”\d{2}/\d{2}/\d{4}”

os dígitos são representados por \d sendo que o {2} ou {4} indicam quantas repetições são esperadas. Outra representação da mesma expressão regular pode ser dada por

@”[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]”

Uma lista contendo todas as marcações especiais e caracteres de escape pode ser vista no página de referência da Microsoft. Para uma entrada invalida, como simplesmente 11, o aplicativo mostra a seguinte mensagem:

Entrada não casou com a expressão definida

Entrada não casou com a expressão definida

Já para uma entrada válida, como 11/11/1111, o aplicativo mostra a seguinte mensagem:

Entrada casou com a expressão definida

Entrada casou com a expressão definida

 Melhorando a expressão regular

A expressão regular como apresentada acima aceita datas invalidas, embora dentro do padrão correto. Para que ela só aceite valores válidos para dia e mês devemos alterar a expressão para inserirmos limites inferiores e superiores para data e mês. Para facilitar a compreensão vou separar a expressão regular em três partes:

Dia

Um dia do mês pode variar entre 01 até 31, porém não temos como definir esse intervalo diretamente. Para fazer essa definição iremos definir a expressão regular da seguinte forma:

“0[1-9]|[1-2][0-9]|3[0|1]”

A expressão a seguir define que um dia pertence ao intervalo 00 a 09 ou 10 a 29 ou 30 a 31, abrangendo assim todas as possibilidades para o dia.

Mês

Um mês do ano pode variar de 01 a 12, e será definido de forma semelhante a definição de dia feita acima:

“0[1-9]|1[0-2]”

Assim são cobertos os intervalos 01 a 09 e 10 a 12.

 Ano

Para o ano o aplicativo arbitrariamente aceitará o intervalo 1800-2099.  A definição desse intervalo pode ser dada pela seguinte expressão regular:

“1[8|9][0-9][0-9]|20[0-9][0-9]”

Juntando as partes

Juntando as partes definidas individualmente acima, temos a seguinte expressão regular:

@“(0[1-9]|[1-2][0-9]|3[0|1])/(0[1-9]|1[0-2])/(1[8|9][0-9][0-9]|20[0-9][0-9])”

Com essa expressão regular já é possível validar a data tanto quanto ao formato quanto ao intervalo esperado para os valores.

Capturando dados a partir da expressão regular

A API de expressões regulares do Windows Phone permite que usemos marcações em um grupo de elementos da expressão regular para salvar o valor que casou com aquele trecho para uso posterior. Usaremos isso para acessar o dia, mês e ano individualmente. Antes de poder acessar os dados temos de adicionar a marcação ?<key> a cada grupo de elementos da expressão regular para acesso posterior.

@“(?<dia>(0[1-9]|[1-2][0-9]|3[0|1]))/(?<mes>(0[1-9])|(1[0-2]))/(?<ano>1[8|9][0-9][0-9]|20[0-9][0-9])”

Utilizando essa expressão, alteraremos o método responsável por tratar a entrada para, caso a entrada seja aceita, exibir os dados separados ao invés da mensagem “Passou”. O método com essas alterações pode ser visto abaixo:

[sourcecode language=”csharp” wraplines=”false” collapse=”false”]
private void OkButton_Click(object sender, RoutedEventArgs e)
{
//Regex data_regex = new Regex(@"\d{2}/\d{2}/\d{4}",RegexOptions.IgnoreCase);
Regex data_regex = new Regex(@"(?<dia>(0[1-9]|[1-2][0-9]|3[0|1]))/(?<mes>(0[1-9])|(1[0-2]))/(?<ano>1[8|9][0-9][0-9]|20[0-9][0-9])", RegexOptions.IgnoreCase);

if (data_regex.IsMatch(DataBox.Text))
{
Match match = data_regex.Match(DataBox.Text);
Result.Text = "Dia: " + match.Result("${dia}") + "\nMês: " + match.Result("${mes}") + "\nAno: " + match.Result("${ano}");
}
else
{
MessageBox.Show("Não passou");
}
}
[/sourcecode]

Como podemos ver acima, para acessar o valor de cada grupo devemos passar “${key}” como parâmetro para o método Result do objeto Match. O objeto Match representa o item que casou com expressão, e o método Result devolve o o trecho que casou com cada grupo de elementos da expressão regular.

Tela apresentado dados separados.

Tela apresentado dados separados.

Expressões regulares podem ser utilizadas para vários outros tipos de validações em um aplicativo windows phone, tratando a entrada de dados tanto pelo usuário quanto a entrada de dados via web-service. A página de referência da microsoft fornece um grande conjunto de marcações, caracteres de escape e marcações para agrupamento de dados, sua consulta pode facilitar muito a criação de uma expressão regular.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *