Estou tentando criar um teste Regex em JavaScript que testará uma string para conter qualquer um destes caracteres:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Mais informações se você estiver interessado :)
É para um aplicativo de alteração de senha muito legal no qual estou trabalhando. Caso você esteja interessado, aqui está o resto do código.
Eu tenho uma tabela que lista os requisitos de senha e conforme os usuários finais digitam a nova senha, ele testará uma matriz de Regexes e colocará uma marca de seleção na linha da tabela correspondente se ... verificar :) Eu só preciso adicionar este no lugar do 4º item na validation
matriz.
var validate = function(password){
valid = true;
var validation = [
RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password),
RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password),
!RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password),
!RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
]
$.each(validation, function(i){
if(this)
$('.form table tr').eq(i+1).attr('class', 'check');
else{
$('.form table tr').eq(i+1).attr('class', '');
valid = false
}
});
return(valid);
}
Sim, também há validação do lado do servidor correspondente!
javascript
jquery
regex
pixelbobby
fonte
fonte
.addClass("check")
e.removeClass("check")
? E verif (someBoolean == true)
em código sempre me faz estremecer. Apenas façaif (someBoolean)
. Ou, melhor ainda, apenas faça$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
.Respostas:
A expressão regular para isso é muito simples. Basta usar uma classe de personagem. O hífen é um caractere especial nas classes de caracteres, portanto, ele precisa ser o primeiro:
Você também precisa escapar os outros metacaracteres de expressão regular.
Editar: o hífen é especial porque pode ser usado para representar uma variedade de caracteres. Esta mesma classe de caracteres pode ser simplificada com intervalos para isto:
Existem três intervalos. '$' para '/', ':' para '?' e '{' para '~'. a última sequência de caracteres não pode ser representada de forma mais simples com um intervalo:! "^ _` [].
Use uma tabela ACSII para encontrar intervalos para classes de caracteres.
fonte
\Q
e\E
não funcionam no mecanismo JS RegExp :(/^\Q.\E$/.test('Q+E'); // true
A maneira mais simples e curta de fazer isso:
Explicação
[^...]
Corresponde a um único caractere não presente na lista abaixo\p{L}
=> corresponde a qualquer tipo de letra de qualquer idioma\d
=> corresponde a um dígito de zero a nove\s
=> corresponde a qualquer tipo de personagem invisível@#
=>@
e#
personagensNão se esqueça de passar a
u
sinalização (unicode).fonte
^
é necessário quando usamos\w
e\s
em letras minúsculas.w
ou foras
, e uma vez que esses dois não se cruzam realmente, apenas deixa passar todos os personagens? (Portanto, não filtrando nada.)/[\W\S]/
) deixa tudo passar. Seria uma representação mais precisa do que acredito que Amir estava chegando[^\w\s]
. No primeiro caso, a expressão regular diz "corresponder a qualquer coisa que não seja alfanumérica OU que não seja espaço em branco", o que, como você mencionou, deixa tudo claro, já que os caracteres alfanuméricos não são espaços em branco e vice-versa. O último diz "corresponder a qualquer coisa que não seja alfanumérica E que não seja um espaço em branco". Obviamente, as exceções se aplicam quando os caracteres acentuados (comoÀ
) são correspondidos por[^\w\s]
.Responda
Explicação
Isso cria uma classe de caractere removendo os caracteres de palavra, caracteres de espaço e adicionando de volta o caractere de sublinhado (pois o sublinhado é um caractere de "palavra"). Tudo o que resta são os caracteres especiais. As letras maiúsculas representam a negação de suas contrapartes em minúsculas.
\W
irá selecionar todos os caracteres não "palavra" equivalentes a[^a-zA-Z0-9_]
\S
irá selecionar todos os caracteres não "espaços em branco" equivalentes a[ \t\n\r\f\v]
_
irá selecionar "_" porque nós o negamos ao usar o\W
e precisamos adicioná-lo novamente emfonte
fonte
RegExp
construtor quando você pode apenas usar um literal regex. Muito menos trabalho de escape (a maioria dos quais são desnecessários de qualquer maneira) e é mais eficiente também.Uma maneira simples de conseguir isso é o conjunto negativo [^ \ w \ s]. Essencialmente, isso captura:
Por alguma razão [\ W \ S] não funciona da mesma forma, não faz nenhuma filtragem. Um comentário de Zael sobre uma das respostas fornece uma espécie de explicação.
fonte
/[^\w\s]/.test('é') # true
,/[^\w\s]/.test('_') # false
.Substitua todos os últimos de qualquer idioma em 'A', e se desejar, por exemplo, todos os dígitos para 0:
fonte