Estoy tratando de crear una prueba Regex en JavaScript que probará una cadena para contener cualquiera de estos caracteres:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Más información si está interesado :)
Es para una aplicación de cambio de contraseña genial en la que estoy trabajando. En caso de que esté interesado, aquí está el resto del código.
Tengo una tabla que enumera los requisitos de contraseña y, a medida que los usuarios finales escriben la nueva contraseña, probará una matriz de expresiones regulares y colocará una marca de verificación en la fila de la tabla correspondiente si ... verifica :) Solo necesito agregar esta en lugar del cuarto elemento de la 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);
}
Sí, también existe la correspondiente validación del lado del servidor.
javascript
jquery
regex
pixelbobby
fuente
fuente
.addClass("check")
y.removeClass("check")
? Y verif (someBoolean == true)
en código siempre me da vergüenza. Solo hazloif (someBoolean)
. O, mejor aún, hazlo$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
.Respuestas:
La expresión regular para esto es realmente simple. Solo usa una clase de personaje. El guión es un carácter especial en las clases de caracteres, por lo que debe ser el primero:
También necesita escapar de los otros metacaracteres de expresión regular.
Editar: el guión es especial porque se puede usar para representar un rango de caracteres. Esta misma clase de caracteres se puede simplificar con rangos a esto:
Hay tres rangos. '$' a '/', ':' a '?' y '{' a '~'. la última cadena de caracteres no se puede representar más simplemente con un rango:! "^ _` [].
Use una tabla ACSII para encontrar rangos para clases de caracteres.
fuente
\Q
y\E
no funciona en el motor JS RegExp :(/^\Q.\E$/.test('Q+E'); // true
La forma más simple y corta de lograr esto:
Explicación
[^...]
Coincide con un solo carácter que no está presente en la lista siguiente\p{L}
=> coincide con cualquier tipo de letra de cualquier idioma\d
=> coincide con un dígito del cero al nueve\s
=> coincide con cualquier tipo de carácter invisible@#
=>@
y#
personajesNo olvide pasar la
u
bandera (unicode).fuente
^
es necesario cuando lo usamos\w
y\s
en minúsculas.w
o afueras
, y dado que esos dos realmente no se cruzan, solo deja pasar a todos los personajes? (Por lo tanto, no se filtra nada)/[\W\S]/
) deja que todo pase. Una representación más precisa de lo que creo que quería decir Amir sería[^\w\s]
. En el primero, la expresión regular dice "coincidir con cualquier cosa que no sea alfanumérica O que no sea un espacio en blanco", lo que, como mencionaste, lo deja todo, ya que los caracteres alfanuméricos no son espacios en blanco y viceversa. El último dice "coincidir con cualquier cosa que no sea alfanumérica Y que no sea un espacio en blanco". Por supuesto, se aplican excepciones en el sentido de que los caracteres acentuados (comoÀ
) coinciden con[^\w\s]
.Responder
Explicación
Esto crea una clase de carácter que elimina los caracteres de palabra, los espacios y vuelve a agregar el carácter de subrayado (como subrayado es un carácter de "palabra"). Todo lo que queda son los caracteres especiales. Las letras mayúsculas representan la negación de sus contrapartes minúsculas.
\W
seleccionará todos los caracteres que no sean de "palabra" equivalentes a[^a-zA-Z0-9_]
\S
seleccionará todos los caracteres que no sean "espacios en blanco" equivalentes a[ \t\n\r\f\v]
_
seleccionará "_" porque lo negamos cuando usamos el\W
y necesitamos volver a agregarlofuente
fuente
RegExp
constructor cuando solo pueda usar un literal de expresión regular. Mucho menos trabajo de escape (la mayoría de los cuales son innecesarios de todos modos) y también es más eficiente.Una forma sencilla de lograr esto es el conjunto negativo [^ \ w \ s]. Esto esencialmente atrapa:
Por alguna razón, [\ W \ S] no funciona de la misma manera, no hace ningún filtrado. Un comentario de Zael sobre una de las respuestas proporciona una especie de explicación.
fuente
/[^\w\s]/.test('é') # true
,/[^\w\s]/.test('_') # false
.Reemplace todos los últimos de cualquier idioma en 'A', y si lo desea, por ejemplo, todos los dígitos a 0:
fuente