Tutorial Windows Phone: Validando dados com expressões regulares
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.
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:
Já para uma entrada válida, como 11/11/1111, o aplicativo mostra a seguinte mensagem:
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.
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.