Estoy usando la siguiente expresión regular junto con abide Foundation para validar una contraseña:

<form id="setPassword" action="{{ url('changePasswordWithoutToken') }}" method="POST" class="account setPassword" data-abide="ajax" novalidate="novalidate">
{{ csrfToken() }}
    <input type="hidden" name="token" value="{{ data.token }}"/>
    <div class="row">
        <div class="large-12 columns"><p>{{ 'PLEASECHOOSEAPASSWORD'|trans }}</p></div>
        <div class="large-12 columns">
            <label class="password" for="setPasswordField">
                <input type="password" id="setPasswordField" name="setPasswordField"  pattern="passwordAdditional" required placeholder="{{ 'ACCOUNTLOGINLABELPASSWORD'|trans }}" />
                <small class="error">{{ 'PASSWORDSHOULDCONTAIN'|trans }}</small>
            </label>
        </div>
    </div>
    <div class="row">
        <div class="large-12 columns">
            <label class="confirmPassword" for="confirmSetPassword">
                <input type="password" id="confirmSetPassword"  name="confirmSetPassword" data-equalto="setPasswordField" required placeholder="{{ 'CONFIRMPASSWORD'|trans }}" />
                <small class="error">{{ 'ACCOUNTREGISTRATIONERRORDIFFERENTPASSWORDS'|trans }}</small>
            </label>
        </div>
    </div>
    <div class="row">
        <div class="small-12 medium-5 large-4 columns">
            <button type="submit" class="button" id="setPasswordBtn">{{ 'SAVECHANGES'|trans }}</button>
        </div>
    </div>

Js:

Patrones: { contraseña Adicional: / ^ (? =. [az]) (? =. [AZ]) (? =. \ d) (? =. [_ \ W \ S]). {8,} / }

Parece que no aparece el símbolo, cuando ingreso una nueva contraseña sin un símbolo, el mensaje de validación desaparece. No debería, ya que no he insertado ningún símbolo dentro de la nueva contraseña. ¿Está mal mi expresión regular?

2
Aessandro 28 ene. 2016 a las 16:55

2 respuestas

La mejor respuesta

Su expresión regular es incorrecta, hay 2 errores que cometió:

(?=.[a-z]) está buscando un solo carácter seguido de una letra minúscula, pero su intención es encontrar una letra minúscula en la cadena, por lo que . debe modificarse por * (0 o mas veces)

(?=.[_\W\S]) está buscando un solo carácter seguido por un guión bajo o un no-palabra o un no-espacio, que literalmente es todo. Esta parece ser su verificación para un símbolo, pero siempre coincidirá (si hay al menos 2 caracteres). Usaría una negación para lograr esto, como (?=.*[^a-zA-Z0-9\s])

Esto lleva a la siguiente expresión regular

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^a-zA-Z0-9\s]).{8,}$/

Puede ver https://regex101.com/r/dG9xL8/1 para ver una demostración.

5
Sebastian Proske 28 ene. 2016 a las 16:56

Espero que esto ayude.

/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/

Necesita al menos 1 letra mayúscula y minúscula, un dígito y un símbolo (entre #?!@$%^&*-).

1
Let'sRefactor 28 ene. 2016 a las 15:22