Mostrando postagens com marcador Máscara. Mostrar todas as postagens
Mostrando postagens com marcador Máscara. Mostrar todas as postagens

segunda-feira, 29 de dezembro de 2014

Regex para validação de moeda

Olá amigos leitores. O tema do post dessa semana foi escolhido por uma necessidade que tive muito tempo atrás. Quando me deparei com o problema aplicar máscaras monetárias (R$) em campos de texto, resolvi construir uma solução própria. Poderia ter usado soluções prontas ? Sim, poderia mas, eu não queria ficar amarrado à soluções de terceiros.

Para resolver o problema, não queria criar uma função grande e de complexidade elevada sendo que, uma regex poderia lidar com esse problema. Então, vamos lá !!

A regex construída:

 ^R\$(\d{1,3}(\.\d{3})*|\d+)(\,\d{2})?$  

Esta regex aceita estes valores:
  • R$2,00
  • R$20,00
  • R$2.000,00
  • R$20.000,00
  • R$200.000,00
  • R$2.000.000,00
Mas, não aceita esses:
  • 2,00
  • 2
  • R$aaa44,00
  • B$20,00
  • $100,00
Importante: Note que o caracter usado para separar os reais dos centavos é o vírgula (,) e não o ponto (.).

Agora, vamos às partes das explicações. Vamos destrinchar a regex.

Os caracteres ^ e $, respectivamente, no início e fim da expressão regular denotam um intervalo fechado, ou seja, o texto que for avaliado só pode conter o dado monetário.

O caracter representa o próprio R do R$. Então, até aí, nenhum mistério. O $ possui significado especial nas regex, logo precisamos de uma barra de escape (\$) para que ela adote a representação de cifrão ($).

Com (\d{1,3}(\.\d{3})*|\d+) definimos que teremos ou algo desse tipo: 2.000 ou 2000. Vamos melhorar isso.

\d{1,3} -> \d representa um dígito. O {1,3} representa no mínimo 1 e no máximo 3 ocorrências. Então, quando temos \d{1,3} estamos querendo dizer que, teremos um dígito que terá no mínimo 1 e no máximo 3 ocorrências.
(....) -> Os parênteses () são usados para definir um subconjunto.
\. -> A barra de escape é usada no ponto (.) para definir o separador de milhar.
\d{3} -> Representa um dígito que será repetido três vezes.
* -> Representa que algo será repetido 0 ou infinitas vezes.
| -> Representa uma operação de ou.
\d+ -> Representa que um dígito será repetido no mínimo 1 e no máximo infinitas vezes.

Agora, que já deciframos uma parte da regex, falta a outra parte: (\,\d{2})?
Essa parte define os centavos logo, algo assim será aceito: ,00.

\, -> Caracter vírgula (,) com barra de escape para assumir a representação de vírgula.
\d{2} -> Ver explicação acima.
(....) -> Ver explicação acima.
? -> Representa que algo será repetido 0 ou 1 vez.

Agora que já esmiuçamos toda a regex, já entendemos como ela funciona e como ela aceita os valores descritos acima. É só pegar e usar.

Sugestões ? Críticas ? Elogios ? Deixe aí embaixo nos comentários ou, na página do facebook.

Página do facebook: https://www.facebook.com/precisoestudarsempre/
Leia Mais ››

domingo, 30 de novembro de 2014

Regex para validar URL

Como você faria para validar uma URL ? Na verdade, você sabe o que é uma URL ? Então para você que não sabe, URL é a sigla para Uniform Resource Locator e consiste em um endereço de um recurso disponível em uma rede.

A estrutura de uma URL é:

esquema://domínio:porta/caminho/recurso?querystring#fragmento

Agora que você já sabe o que é uma URL, voltamos à primeira pergunta: Como você faria para validar uma URL ?

Para responder à essa pergunta, você pode adotar duas abordagens. A primeira é: construir funções gigantescas e a segunda: construir uma regex.

A validação a qual, estou abordando, é de estrutura. Não há nenhuma questão semântica (de significado) por trás. Então, mãos à massa.

Em primeiro lugar, é importante ressaltar que eu não criei esta regex. Peguei ela do livro abaixo.


Este livro não é caro e é muito bom. Recomendo à todos.

Realizei algumas modificações e melhorias na regex. Pus ela para aceitar URLs de ftp e aceitar endereços que comecem sem o esquema. Segue abaixo.

 ((https?:\/\/)|(ftp:\/\/)|(^))([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+([a-zA-Z]{2,9})(:\d{1,4})?([-\w\/#~:.?+=&%@~]*)  

Vamos aplicar a regex no nosso código.

 function validarURL(url){  
      if(/((https?:\/\/)|(ftp:\/\/)|(^))([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+([a-zA-Z]{2,9})(:\d{1,4})?([-\w\/#~:.?+=&%@~]*)/.test(url)){  
           alert('Formato correto !');  
      } else {  
           alert('Formato incorreto !');  
      }  
 }  

Pronto !! Em poucas linhas já possuímos algo funcional. A função acima foi escrita em Javascript.

Dicas ? Sugestões ? Críticas ? Deixe aí nos comentários.

Referência:

http://pt.wikipedia.org/wiki/URL

Leia Mais ››

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
Leia Mais ››

terça-feira, 14 de maio de 2013

Regex para datas - Máscara para datas

Para validar datas é possível criar diversas soluções, como:
  • Validação server-side;
  • Utilização de plugins prontos;
  • Quebrar a string fazendo um split na barra e validando caracter por caracter via Javascript.
Existe uma outra forma, embora não tão simples mas, muito refinada e com poucas linhas de código. Essa forma é utilizar uma Regex. Em Javascript é possível criar regexs e utilizá-las para validação. Quando criamos uma regex em Javascript, um objeto do tipo RegExp é gerado e com eles métodos são disponibilizados. Abaixo, apresento-lhes uma regex que criei para realizar essa validação.

/([0-2][0-9]|3[0-1])\/(0[0-9]|1[0-2])\/[0-9]{4}/

Essa regex valida datas do formato dd/mm/yyyy. Com dias indo de 01 até 31, meses indo de 01 até 12 e anos variados.
Leia Mais ››