Estoy tratando de asegurarme de que se incluyan al menos 4 caracteres alfanuméricos en la entrada, y que también se permitan guiones bajos.
El tutorial de expresiones regulares está un poco por encima de mi cabeza porque habla de aserciones y éxito/fracaso si hay una coincidencia.
^\w*(?=[a-zA-Z0-9]{4})$mi entendimiento:
\w --> alfanumérico + guión bajo
* --> coincide con el token anterior entre cero y un número ilimitado de veces (esto significa que puede ser cualquier carácter que sea alfanumérico/guión bajo, ¿correcto?)
(?=[a-zA-Z0-9]{4}) --> ve por delante de los caracteres anteriores, y si incluyen al menos 4 caracteres alfanuméricos, entonces estoy bien.
Obviamente, estoy equivocado en esto, porque regex101 no me muestra coincidencias.
Desea 4 o más caracteres alfanuméricos, rodeados por cualquier número de guiones bajos (use ^ y $ para asegurarse de que coincida con la entrada completa):
^(_*[a-zA-Z0-9]_*){4,}$Sugiero usar grupos atómicos (?>...) , consulte el tutorial de expresiones regulares para obtener más detalles
^(?>_*[a-zA-Z0-9]_*){4,}$para asegurar 4 o más fragmentos cada uno de ellos conteniendo letra o dígito.
Editar: si regex no es compatible con atomic, intentemos usar solo grupos:
^(?:_*[A-Za-z0-9]_*){4,}$Su patrón ^\w*(?=[a-zA-Z0-9]{4})$ no coincide porque:
^\w* Coincide con los caracteres de palabra opcionales desde el principio de la cadena, y si solo hay caracteres de palabra, coincidirá hasta el final de la cadena(?=[a-zA-Z0-9]{4}) La anticipación positiva es verdadera, si puede afirmar 4 caracteres alfanuméricos consecutivos a la derecha de la posición actual. El \w* permite retroceder, y puede retroceder 4 posiciones para que la afirmación sea verdadera.$ afirma el final de la cadena, que no puede coincidir ya que la posición se movió 4 pasos a la izquierda para cumplir con la afirmación anterior de búsqueda anticipada positiva.Usando la búsqueda anticipada, lo que puede hacer es afirmar 4 caracteres alfanuméricos precedidos por guiones bajos opcionales.
Si la afirmación es verdadera, haga coincidir 1 o más caracteres de palabra.
^(?=(?:_*[a-zA-Z0-9]){4})\w+$El patrón coincide:
^ Comienzo de cadena(?= Lookahead positivo, afirmar lo que está a la derecha es(?:_*[a-zA-Z0-9]){4} Repetir 4 veces haciendo coincidir _ opcional seguido de un carácter alfanumérico) Cerrar la búsqueda anticipada\w+ Coincide con 1+ caracteres de palabra (que incluye el _ )$ Fin de la cadena