quinta-feira, 1 de agosto de 2013

Regex para aceitar acentos

Um dia estava precisando realizar uma validação de entrada de dados em um campo de texto. Nesse campo de texto só seria permitido entrar valores nos seguintes padrões:

aaaaa
AAAA
aaa111
AAA111
AAaa111
áááÁÁÁÁ
a-a-a
_i-i-i-i

onde:

a: representa letra qualquer que pode ir de a - z
A: representa letra qualquer que pode ir de A - Z
1: número qualquer que pode ir de 0 - 9
á: representa letra acentuada qualquer que pode ir de à-ú
Á: representa letra acentuada  qualquer que pode ir de À-Ú
_ e -: representam os caracteres _ e -

Não queria usar nenhum plugin jquery. Queria usar uma regex pois, queria algo performático. Realizando pesquisas atrás da regex, achei a solução no endereço (para quem estiver lendo esse post, recomendo olhar esse link).

http://aurelio.net/regex/guia/acentuacao.html#5_5

Analisando o conteúdo do link, montei minha regex, segue abaixo:

/^([a-zA-Zà-úÀ-Ú0-9]|-|_|\s)+$/

onde:

^ = Demarca início da linha.
[a-zA-Zà-úÀ-Ú0-9] = Representa uma letra qualquer que pode estar no intervalo de a-z ou, de A-Z, ou de à-ú, ou de À-Ú, ou um número que pode estar entre 0 ou 9.
| = Representa a operação lógica "or".
- e _ = Representam os caracteres - (hífen) e _ (underline), respectivamente.
\s = Encontra um caracter de espaço (whitespace).
+ = Representa 1 ou mais ocorrências de alguma coisa.
$ = Demarca fim de linha.

Importante: Para entender uma regex é necessário avaliar as partes em alguns momentos mas, em outros é necessário entender o todo.

Se, esta é sua primeira vez aqui no blog ou, é seu primeiro contato com regex, recomendo você dar uma olhadinha em outros posts:

http://precisoestudarsempre.blogspot.com.br/2013/03/mascara-para-valores-decimais-negativos.html
http://precisoestudarsempre.blogspot.com.br/2013/05/regex-para-datas-mascara-para-datas.html
http://precisoestudarsempre.blogspot.com.br/2013/06/regex-para-horas-mascara-para-horas.html

Recomendo também você dar uma olhadinha nesse link:

http://www.w3schools.com/jsref/jsref_obj_regexp.asp

9 comentários:

Adm disse...

Ajudou muito! Obrigado.
Só uma observação: Não é preciso colocar [a-zA-Z], se vc por [A-z] ele já aceita maiusculas e minusculas. O msm serve para os acentuados: [A-zÀ-ú].

Preciso estudar sempre disse...

Poxa que ótimo. Obrigado pela observação. Sempre que tiver mais observações, sinta-se livres para realizá-las.

Alexandre disse...

Discordo do Adm pois Regex é baseado na tabela ASCII e assim com [A-z] ele vai pegar também outros caracteres como o underline _

Preciso estudar sempre disse...

Verdade, Alexandre está certo !! O teste foi feito e o _ foi pego !

Rodrigo Paulino disse...

/[à-ü]/gi é o ideal, pois há também o trema, comum em textos como "lingüiça", de textos em português antigo, e palavras estrangeiras, como "Müller".

Lembrando que o parâmetro "i" já se encaixa como Insensitive.

Preciso estudar sempre disse...

Ótima observação e contribuição Rodrigo Paulino. Sempre que quiser contribuir com o Preciso Estudar Sempre, fique a vontade.

Gerrard disse...

Muito massa. mandou bem demais, ajudou muuito!

Ulisses Hen disse...

Essa dica foi valiosissíma:

"Só uma observação: Não é preciso colocar [a-zA-Z], se vc por [A-z] ele já aceita maiusculas e minusculas. O msm serve para os acentuados: [A-zÀ-ú]."

Mau disse...

Bastante útil, valeu mesmo!