Expressao Regular :: JAVASCRIPT ::

18 respostas
E

Ola a todos, bom dia.

Pessoal, aindei pesquisando sobre regex em javascript, mas ainda ficou alguma duvida. Talvez alguem pode me dar um resposta mais objetiva.
Em pratica eu preciso identificar se o usuario digitou na PASSWORD alguns caracteres que por seguranca nao sao permitidos, TIPO:

  • @ # ; ’ < > &

Eu olhei sobre listas negadas, mas confesso que nao entendi bem. Se alguem puder me dar uma exemplo mais claro agradeco.
Abs e obrigado!
ERMelo

18 Respostas

R

Listas negadas são simples, se você sabe o que é uma lista, simplesmente entenda que lista negada é o inverso.

Enquanto uma lista de diz tudo o que casa em determinada posição, a lista negada te diz tudo aquilo que não casa.

ou seja, se você tem uma lista [ABC], sua expressão regular vai casar com A, B ou C.
agora se tem uma lista [^ABC], sua expressão regular vai casar qual qualquer coisa que não seja A, B ou C.
o ^ dentro da lista indica que ela é negada.

Portanto você pode criar uma lista que tenha tudo isso incluso assim [^<>&’ ;#@-].

Vale lembrar que dentro da lista todo mundo é normal, não existem caracteres especiais, portanto não é preciso escapá-los.
agora se você quer se livrar de todos os caracteres especiais, existem metacaracteres especiais para isso, pesquise por Classes POSIX.

Espero ter ajudado!

E

Ola Digao.

To tentando desse jeito ja algumas vezes e nao roda, me da erro de sintaxe:

var invalid = [^<>&' ;#@-]; if(invalid.search(document.pwdform.pass2.value) != -1){

Voce consegue me dizer como posso declarar essa lista negada?

Agradeco.

Abs,

L

Coloque a sua expressao regular entre //.
Assim:
/^(\d{2}/){2}\d{4}$/

Veja se funciona.

R
var patt1=new RegExp("[^<>&' ;#@-]");
document.write(patt1.exec(minhaString));

o exec vai varrer a String e ver se casa em algum lugar, se casar ele vai retornar pra você o caracter, se não casar retorna null.

Fonte: http://www.w3schools.com/js/js_obj_regexp.asp

E

Digao,

Tentei como o seu exemplo, mas agora nao passa do IF mais, como se os caracteres fossem sempre a lista negada etc. Testei com os metodos exec e tambem test, mas entra sempre no if e return.

var invalid = new RegExp("[^<>&';#@\]"); if(invalid.test(document.pwdform.pass2.value)){

R

var invalid = new RegExp("[<>&';#@\]"); if(invalid.exec(document.pwdform.pass2.value) != null){ alert('Encontrei caracteres inválidos'); }else{ alert('Password válido'); }Tente assim, eu nunca usei o exec, fiz esse código me baseando no que eu li na referência acima.

Detalhe, se você está buscando os inválidos, não pode usar uma lista negada, pois se negar a lista, vai casar com qualquer coisa que não esteja ali.

E

Digao. Nao me pergunte porque mas agora ta funcionando (Sem a lista negada ^), mas somente a barra passa. Sabe como posso tratar a barra (\ - \ - ‘\’), tentei de todos os jeitos mas passa.

var invalid = new RegExp("[<>&';#@\]"); if(invalid.exec(document.pwdform.pass2.value)!=null){

Agradeco a forca.
Abs e muito obrigado!

R

Está funcionando porque você agora está procurando pelos caracteres inválidos, antes você os negava.

Então, umas considerações:

Quando eu falei que dentro da lista todo mundo é normal, eu não estava mentindo, porém dentro da variável isso não é verdade, o \ é usado para escapar dentro da String também, então no caso se você faz \ você estaria escapando o caractere da frente, invalidando o caracter que você quer.

Preparado pra solução? escape o escape :slight_smile:

assim: \\
Eu sei que é feio, porém não me recordo se existe algo que diga que uma lista é crua em JavaScript, portanto é o jeitovar invalid = new RegExp("[<>&';#@\\\\]");

T

Fala grande digaoneves!!!

[…]
assim: \\
Eu sei que é feio, porém não me recordo se existe algo que diga que uma lista é crua em JavaScript, portanto é o jeito
var invalid = new RegExp("[<>&’;#@\\]");
[…]

Apenas uma observaçãozinha para nosso colega Edvaldo_Melo

Não precisa ter 4 barras invertidas \\ dentro da lista na regex, apenas duas…

dentro da lista, 2 barras a mais se tornam redundante porque a lista compara caractere a caractere e \ é um caractere, então, pode ter quantos \ forem na string a ser analisada que a lista vai pegar todas elas :smiley:

apenas 2 barras (para representar uma “” literal) dentro da lista dão conta do recado :wink:

roda esse exemplo que peguei da w3schools no console do firebug para tirar a prova real

var str="Hello \\\\ world!"; var patt=/[<>&';#@\\]/g; var result=patt.test(str); console.log(result); // imprime "true" no console porque encontrou as 2 barras literais na string da variavel "str" console.log(str);

T

Edvaldo_Melo,

o digao deu uma dica muito boa pra vc hen cara!!! USE CLASSES POSIX!!! 8)

olha esse link:
[url]http://www.regular-expressions.info/posixbrackets.html[/url]

procura pela classe [:punct:] e veja os caracteres que ela casa dentro de uma lista na regex...

[:punct:] = [!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]

MAS.....

No javascript as classes posix não funcionam :shock: hehehehehehe então, tem que escrever a lista toda na mão mesmo...

eu só passei o link para agregar conhecimento para nós :lol:

Executa esse codigo no console do firebug e fique feliz com o resultado :wink:
var str1="Hello \\ world!";
var str2="Hello world";

var patt=/[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]/g;

var result1=patt.test(str1);
var result2=patt.test(str2);

console.log(result1); // imprime "true" porque a variavel "str1" contem caracteres que casam com a lista da regex que criamos ( \\ e o !)
console.log(result2); // imprime "false" porque na variavel "str2" nao ha caracteres que casam com a nossa lista da regex
T

Pessoal…

Sem querer fazer propaganda, mas dêem uma olhada no material que o (Mestre Jedi brasileiro das regex) Aurélio Marinho Jargas disponibiliza no site dele:
http://aurelio.net/regex/guia/
http://www.piazinho.com.br/

Esse é um bom material para aprender expressões regulares!

Só lá é que consegui aprender regex corretamente!! (e depois de estudar a teoria dos autômatos finitos hehehe )

R

thiagof:
Fala grande digaoneves!!!

[…]
assim: \\
Eu sei que é feio, porém não me recordo se existe algo que diga que uma lista é crua em JavaScript, portanto é o jeito
var invalid = new RegExp("[<>&’;#@\\]");
[…]

Apenas uma observaçãozinha para nosso colega Edvaldo_Melo

Não precisa ter 4 barras invertidas \\ dentro da lista na regex, apenas duas…

dentro da lista, 2 barras a mais se tornam redundante porque a lista compara caractere a caractere e \ é um caractere, então, pode ter quantos \ forem na string a ser analisada que a lista vai pegar todas elas :smiley:

apenas 2 barras (para representar uma “” literal) dentro da lista dão conta do recado :wink:

roda esse exemplo que peguei da w3schools no console do firebug para tirar a prova real

var str="Hello \\\\ world!"; var patt=/[<>&';#@\\]/g; var result=patt.test(str); console.log(result); // imprime "true" no console porque encontrou as 2 barras literais na string da variavel "str" console.log(str);

Você está correto thiagof, mas o que não foi mencionado é que sua string é crua.

Ou seja, ela não será interpretada como uma String comum, tudo o que está nela são caracteres e nenhum deles tem uma função especial.var string = "Minha String"; var stringCrua = /Minha String Crua/;Quando a String é entre barras, e não entre aspas, aí sim um escape simples funcionaria, agora com aspas não.

Quando não utilizamos Strings cruas, temos que prever o processamento da String antes do processamento da regex.

Eu nem tinha me atentado à strings cruas, pois como não existe isso em Java, as vezes passa batido hehehe.

Obs: O exemplo com \\ eu peguei do livro do Aurélio, rs.

E

Digao e Thiago.

Muito obrigado pela ajuda/dicas, com certeza vou dar uma estudada sobre esse assunto que è frequente no nosso dia-a-dia, e tambem uma “mao” na roda para resolver determinadas situacoes.

Abs a todos!!!
Arrivederci

T

Fala digaoneves!!!


Você está correto thiagof, mas o que não foi mencionado é que sua string é crua.

Ou seja, ela não será interpretada como uma String comum, tudo o que está nela são caracteres e nenhum deles tem uma função especial.

var string = "Minha String";  
var stringCrua = /Minha String Crua/;

Quando a String é entre barras, e não entre aspas, aí sim um escape simples funcionaria, agora com aspas não.

No javascript não existe strings cruas :lol: , aquilo lá é a declaração de um objeto regex em notação literal :wink:
Dá uma olhada no link abaixo para entender como funciona:
http://translate.google.com.br/translate?hl=pt-BR&langpair=en%7Cpt&u=http://james.padolsey.com/javascript/regular-expressions-in-javascript/

Em C# tem strings cruas, lá vc coloca um @ na frente da string, tipo assim: String rawStr1 = @“String crua”;
http://en.wikipedia.org/wiki/String_literal Procura por “Raw strings” nessa pagina…

No java e javascript não tem isso, uma pena porque ajudaria muito :frowning:

R

opa, verdade hein… diferença importante, obrigado thiagof.

Mas acho que isso ainda não invalida meu comentário sobre \\ , pois da maneira que estava sendo feito, a expressão é interpretada em runtime, portanto não creio que exista outra maneira de fazer.

a não ser é claro, com a declaração em notação literal que você apresentou.

T

Opa, tem razão!!!

esqueci que vcs estavam usando o new RegExp("[^<>&’ ;#@-]");

Falha minha… desculpa aeee foi mal :oops:

M

e ai galera ,estou comesando regex , e nao sei como declacar o regex :?:,no javacript,alguem pode me ajudar :idea: .
vwl

P

http://www.w3schools.com/js/js_obj_regexp.asp

Criado 22 de maio de 2012
Ultima resposta 30 de jan. de 2013
Respostas 18
Participantes 6