Expressao Regular :: JAVASCRIPT ::

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

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!

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,

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

Veja se funciona.

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

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)){

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.

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!

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("[<>&';#@\\\\]");

Fala grande digaoneves!!!

[quote][…]
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("[<>&’;#@\\]");
[…][/quote]

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);

Edvaldo_Melo,

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

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

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:

[code]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
[/code]

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 )

[quote=thiagof]Fala grande digaoneves!!!

[quote][…]
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("[<>&’;#@\\]");
[…][/quote]

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);[/quote]

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.

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

Fala digaoneves!!!

[quote]
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. [/quote]

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:

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.

Opa, tem razão!!!

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

Falha minha… desculpa aeee foi mal :oops:

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

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