为什么这个javascript正则表达式不起作用?
我用javascript编写了一个正则表达式,用于密码验证,但它也适用于无效密码。密码必须是8个字符长,包含一个字母、一个数字和一个特殊字符,但当我输入类似“abcd”的内容时,它也可以工作。代码如下:为什么这个javascript正则表达式不起作用?,javascript,regex,flask,Javascript,Regex,Flask,我用javascript编写了一个正则表达式,用于密码验证,但它也适用于无效密码。密码必须是8个字符长,包含一个字母、一个数字和一个特殊字符,但当我输入类似“abcd”的内容时,它也可以工作。代码如下: function nonValidPassword(e){ let userPassword = document.getElementById("register-password").value; const passwdMessage = docume
function nonValidPassword(e){
let userPassword = document.getElementById("register-password").value;
const passwdMessage = document.getElementById("password-validation-message");
const registerButton = document.getElementById("register-button");
let validPassword = new RegExp("^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
let passwordChecker = validPassword.test(userPassword);
if (passwordChecker==false){
e.preventDefault();
alert("PLEASE ENTER A VALID PASSWORD!");
}
else
{
document.form.submit();
}
}
registerButton.addEventListener('click',nonValidPassword);
后端是:
from flask import Flask,render_template,request,redirect,url_for
import model
import datetime
app = Flask(__name__)
@app.route("/",methods=["POST","GET"])
def login():
if request.method == "GET":
return render_template("login.html")
else:
email = request.form["email"]
username= request.form["username"]
password = request.form["password"]
username_exists = model.check_if_username_exists(username)
if username_exists:
return render_template("register.html",infoMsg=f"sorry, the username {username} already exists! ")
else:
model.register_new_user(email,username,password)
return render_template("login.html",infoMsg=f"{username} successfully registered!")
@app.route("/register")
def register():
return render_template("register.html")
这是模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="static/style.css">
<link href="https://fonts.googleapis.com/css2?family=Jua&display=swap" rel="stylesheet">
<title>Calendar Lite</title>
</head>
<body>
<div class="login-container">
<div class="login-field">
<form method="POST" action="/" id="login-form">
{{infoMsg}}
<div id="password-validation-message"></div>
<h1>Please enter the following parameters: </h1>
<label for="username">Username:</label>
<input type="text" name="username" ><br><br>
<label for="username">Email:</label>
<input type="text" name="email" ><br><br>
<label for="password">Password (must at least 8 characters long, should have at least one alphabet letter, one special character and at least one number.):</label><br>
<input type="password" name="password" id="register-password"><br><br>
<button type="submit" class="btn-submit" id="register-button">REGISTER</button><br><br>
<h4><a href="/" class="btn"> I have an account</a></h4>
</form>
</div>
<img src="static/login-picture.png" alt="pic" class="login-picture" width="1000px">
</div>
<script src="static/register.js"></script>
</body>
</html>
日历精简版
{{infoMsg}}
请输入以下参数:
用户名:
电邮:
密码(长度必须至少为8个字符,至少应有一个字母、一个特殊字符和至少一个数字):
注册
正则表达式的问题几乎是一个输入错误,但它缺少一个结束锚。使用此版本:
^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*]).{8,}$
更新代码:
let validPassword = new RegExp("^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*]).{8,}$");
上述更新的正则表达式表示:
^ from the start of the password
(?=.*[a-zA-Z]) assert that one letter is present
(?=.*[0-9]) assert that one number is present
(?=.*[!@#\$%\^&\*]) assert one symbol
.{8,} then match any 8 or more characters
(this also contains the length requirement)
$ end of the password
看来你的正则表达式很好,我也能按原样跑步了。你能更具体地说明你所说的“它也有效”是什么意思吗?Thanks@MattNewelski它似乎不工作。我的意思是,演示报告了一个匹配,但它是零宽度匹配,输入的密码与正则表达式不匹配,因为模式不匹配。我解决了它。问题是const registerButton在函数范围内,所以当我给它一个eventlistener时,它报告了一个错误。一旦我把它放在全球范围内,它就工作得很好。