Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regex quantificadores com problemas! #47

Closed
pyetrosafe opened this issue Aug 20, 2013 · 14 comments
Closed

Regex quantificadores com problemas! #47

pyetrosafe opened this issue Aug 20, 2013 · 14 comments
Labels

Comments

@pyetrosafe
Copy link

Olá igor.
Achei seu plugin jquery Mask, achei muito bom, melhor doque o que eu usava antes, maskedinput.

Gostaria de dar algumas sugestões quanto ao meu uso dele, e talvez algumas coisas sejam apenas falta de conhecimento do plugin ^^ !!!

Bom primeiramente, estava procurando um mask para um campo senha para limitar caracteres inválidos e definir comprimento também. A boa é que não preencheu toda mascará com caracteres especiais (como no maskedinput o 'placeholder'), pois se tratando de um campo senha, seria estranho.

Vamos lá, Senti certa dificuldade em definir a mascara pelo tamanho opicional de 4 a 20 caracteres.

Primeiramente tentei isso:
$('input[type=password]').mask('A{4,4}A{0,16}');
Por regex deveria conter os 4 primeiros e poder conter outros 16 caracteres. Mas ao digitar aceita apenas 6 caracteres. Parece que no segundo regex ele conta mais 1 caractere "{0" e mais um caractere ",1" e ignora o "6}" para a mascara toda, ou seja, os 4 primeiros mais 2.

Solucionei parcialmente usando:
$('input[type=password]').mask('A{4,4}A{0,7}A{0,7}');
Nesse caso tive que usar "A{0,7}" duas vezes. Como antes, ele contou depois dos 4 primeiros, mais 8 caracteres e mais 8 caracteres, sendo então 4 + 8 + 8 = 20, sendo que nessa regra escrita deveria ser 4 + 7 + 7.

Verificando melhor vi que algumas regras não seguem como deveriam, veja exemplo:
.mask('9{4,4}S{0,4}');
Casa com: "1234abcde", mas deveria casar só com: "1234abcd".

.mask('9{4}S{0,4}');
Não casa com: "1234abcd" como deveria, mas casa com: "12abcde". Não reconheceu "{4}" como expressão regular, mas sim "{" e "}" caractere mascara (?) e "4" como um único numero.

.mask('9{4,4}S{0,4}');
Como no exemplo de cima a mascara não entendeu que era regex na primeira regra, então tentei escapar o regex usando "" mas continuou como no primeiro exemplo. O resultado foi "1234abcde".

.mask('9{4}S{0,4}');
Assim como no exemplo de cima o uso do escape "" não funcionou (foi só um teste meu a fim de explorar o plugin). O resultado foi o mesmo da mask "9{4}S{0,4}" e nos dois casos os caracteres "{" e "}" não são impressos, já que estes não foram entendidos como regex.

Mesmo usando a opção maskChars, nenhuma tentativa ('{': '{', '{': '{', '{': '{', '{': '{') faz o plugin entender "{" como caractere mascará (imprimir o caractere) invés de regex. Para isso foi necessário usar o translation ('b': '{', 'i': '}'), mas dessa forma os caracteres "{" e "}" devem ser digitados e não é colocado automáticamente.

Ainda nesse ponto do regex, quando o uso do quantificador "{,}" temos o seguinte:

"{n}": não entende como regex mas também não imprime as "chaves" ("{" e "}") como caractere mascara;
"{0,n}": usa da soma de 1 caractere "0" com o valor de "n". Ex: "{0,4}" aceita 5 caracteres;
"{1,n}": aqui, diferente do exemplo anterior funciona corretamente, aceita 1 ou n caracateres;
"{n,}": não entende a regra, ao menos "n" ou mais. Aqui imprime o caractere 2x (independente do valor de n) e não imprime mais nada depois disso;

Tentando usar o Translation com regex:

Ao aplicar uma tentativa de regex com o translation tive outro problema:
.mask('9S', {translation: {9: '[0-9]+'}});
Nesse caso seria correto de acordo com a regra aceitar quantos números fossem, seguidos de uma letra, mas o que ocorre é aceitar 1 número e 1 letra ou 2 números;

.mask('9S', {translation: {9: '[0-9]*'}});
O mesmo problema que o exemplo acima, porém casa corretamente com "a";

Bom, é isso que eu verifiquei até agora caro Igor.
Ah outra coisa interessante, seria por a opção de ter o placeholder com true ou false nas opções, com default: false.
Ah, também senti falta da função onBlur, nas options do plugin, tendo que criar um script por fora. Aqui eu usaria pra verificar o valor quando onComplete não fosse chamado.

De qualquer forma seu plugin me ajudou em 2 páginas funcionando muito melhor que o maskedinput em uma delas (mascarar notas de provas, até deixando o código bem menor) e funcionou com esse pequeno problema no caso do password, sendo que o outro plugin nem funcionou!

Aguardo ancioso seu retorno e uma nova versão corrigida para testar.

Abraço... Pyetro Sabaraense F. da Costa (http://www.pysafe.blogspot.com.br, www.pbcalc.portalsh.com.br - portalsh em construção).

@igorescobar
Copy link
Owner

Usar a mascara "A{4,16}" não resolve?

@pyetrosafe
Copy link
Author

Infelizmente não funciona caro amigo...
Quando coloco "A{4,16}" Ele apenas me deixa escrever "a1" ou "11" (letra e número ou número e número)!!!
Se trata do erro que comentei em um dos exemplos iniciais:

.mask('9{4}S{0,4}');
Não casa com: "1234abcd" como deveria, mas casa com: "12abcde". Não reconheceu "{4}" como expressão regular, mas sim "{" e "}" caractere mascara (?) e "4" como um único numero.

@igorescobar
Copy link
Owner

Vamos por lá... você está tentando fazer muitas coisas que o plugin ainda não suporta. Ele suporta expressões simples de regex e não toda a stack de possibilidades de uma expressão regular.

{4} - Não é suportado.
{0,4} - Não é suportado.

Você tentou se explicar mais acho que é mais fácil você dizer o que você quer como resultado final do que explicar tudo o que você tentou fazer rs.

Você quer que os 4 primeiros digitos sejam numeros e os 12 seguintes sejam letras minusculas, é isso?

@pyetrosafe
Copy link
Author

Hehehehe eu coloquei tanta coisa que verifiquei no plugin que devo dificultado ver minha dificuldade inicial...
Vamos lá ^^

O que eu queria, era realmente ter um campo Alfanumérico de 4 a 20 caracteres.
De primeira eu havia tentado como você propôs "A{4,20}". Blz, isso não funcionou, provavelmente o plugin deve estar esperando apenas 2 números dentro das chaves, ao colocar 3 ele se perde. Também se perde se o primeiro valor for 0 ("{0,n}").

Quer dizer, eu apenas tentei de uma forma, de outra forma, e outra forma, e acabei detectando essas falhas em entender o quantificador regex. Assim como eu tinha comentado:

Ainda nesse ponto do regex, quando o uso do quantificador "{,}" temos o seguinte:

"{n}": não entende como regex mas também não imprime as "chaves" ("{" e "}") como caractere mascara;
"{0,n}": usa da soma de 1 caractere "0" com o valor de "n". Ex: "{0,4}" aceita 5 caracteres;
"{1,n}": aqui, diferente do exemplo anterior funciona corretamente, aceita 1 ou n caracateres;
"{n,}": não entende a regra, ao menos "n" ou mais. Aqui imprime o caractere 2x (independente do valor de n) e não imprime mais nada depois disso;

Porém no terceiro item dessa marcação "{1,n}", esqueci de acrescentar que: se "n" for maior que 9, ou seja, conter 2 algarismos, ele também se perde.

@igorescobar
Copy link
Owner

Ah! Mas A{4,20} deveria funcionar perfeitamente, deve ser um bug, vou investigar isso hoje e já corrijo. Sorry!

@igorescobar
Copy link
Owner

@pyetrosafe vi que era simples de resolver, atualiza para versão v0.11.5 e veja se resolve seu problema. A mascara A{4,20} deve funcionar agora.

@pyetrosafe
Copy link
Author

Hehehehehe Firmeza xD
Eu estava usando de primeira a versão 10.3 eu acho, eu já atualizei aqui pra 11.4 e continuou igual... Esqueci de mencionar isso... 😄

@pyetrosafe
Copy link
Author

Ah ok... vou atualizar ;D

De qualquer forma, da uma olhada nos outros pontos desse tópico ^^
Me responde depois... ;D

Updated

Testado, funcionando perfeitamente:

"A{4,20}"
"S{2,4}9{2,4}"

Menos estes:

"A{0,4}"
"A{4}"

@igorescobar
Copy link
Owner

Não tenho previsão de fazer funcionar estes outros 2 pontos @pyetrosafe. Se os usuários começarem a pedir eu volto a revisar este assunto.

@pyetrosafe
Copy link
Author

Ok... ;)

E estes casos ?

Exibir os caracteres "{}" automaticamente, tem uma maneira específica que não conheço?

Mesmo usando a opção maskChars, nenhuma tentativa ('{': '{', '{': '{', '{': '{', '{': '{') faz o plugin entender "{" como caractere mascará (imprimir o caractere) invés de regex. Para isso foi necessário usar o translation ('b': '{', 'i': '}'), mas dessa forma os caracteres "{" e "}" devem ser digitados e não é colocado automáticamente.

E esses últimos:

Ah outra coisa interessante, seria por a opção de ter o placeholder com true ou false nas opções, com default: false.
Ah, também senti falta da função onBlur, nas options do plugin, tendo que criar um script por fora. Aqui eu usaria pra verificar o valor quando onComplete não fosse chamado.

@igorescobar
Copy link
Owner

@pyetrosafe eu foco na entrega de features, casos de uso, eu não posso sair programando para o plugin sair atendendo todas as possibilidades por mais malucas que elas sejam. Meu objetivo não é fazer com que o usuário possa colocar qualquer coisa que o plugin vai se virar e entender. Aonde tiver utilidade eu vou agir. Se você me disser que existe uma mascara em que estes pontos seriam úteis e que com o que tem o plugin hoje não é possível fazer eu ataco o problema, sacou?

Caso contrário fica difícil ;)

@igorescobar
Copy link
Owner

Se você quiser usar o caracter { e } como caracteres de mascara, você precisa escapa-lo corretamente pois { é um caracter reservado de regex então você precisa fazer desta forma {'{': '{'}. Da mesma forma que foi feito com o parenteses: '(': '(',

@igorescobar
Copy link
Owner

A opção de placeholder já foi sugerida por outro usuário, porém, o html 5 já oferece o atributo placeholder="" que da conta do recado, certo? A sacada do onBlur já está sendo pensada também.

@pyetrosafe
Copy link
Author

Saquei velho...
Bom o caso do placeholder é porque ainda temos usuários com navegadores sem suporte a HTML 5!!! Faria isso então para atingir esses usuários.
Vlw, vou tentar escapar o "{"...
O caso do regex quantificador {4} seria apenas para simplificar {4,4}...
Bom isso...

Parabéns amigo... mt bom o plugin e a sua atenção em visualizar o comentário da galera!!!
Até mais, sucesso!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants