在 Flask-WTForms 的表单验证中,wtforms.validators.Regexp
允许使用 正则表达式 进行自定义验证。以下是一些 常见的正则表达式,以及它们在 Flask-WTF 中的使用方法。
1. 常见正则表达式
验证类型 | 正则表达式 | 说明 |
---|---|---|
用户名 | ^[a-zA-Z0-9_]{3,20}$ | 允许字母、数字、下划线,长度 3-20 |
密码 | ^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,12}$ | 必须包含 字母+数字,6-12 位 |
手机号(中国) | ^1[3-9]\d{9}$ | 以 1 开头的 11 位数字 |
邮箱 | ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ | 电子邮件格式 |
身份证号(中国) | `^\d{6}(18 | 19 |
IP 地址 | ^(?:\d{1,3}\.){3}\d{1,3}$ | IPv4 地址 |
日期(YYYY-MM-DD) | `^\d{4}-(0[1-9] | 1[0-2])-(0[1-9] |
URL | ^https?://[^\s/$.?#].[^\s]*$ | 网址格式 |
纯中文 | ^[\u4e00-\u9fa5]+$ | 仅允许中文字符 |
2. 在 Flask-WTF 中使用
在 wtforms.validators.Regexp
里添加正则表达式进行验证,例如:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Regexpclass RegisterForm(FlaskForm):username = StringField('用户名', validators=[DataRequired(),Regexp(r'^[a-zA-Z0-9_]{3,20}$', message="用户名只能包含字母、数字、下划线,长度3-20")])password = PasswordField('密码', validators=[DataRequired(),Regexp(r'^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,12}$', message="密码必须包含字母和数字,长度6-12位")])phone = StringField('手机号', validators=[DataRequired(),Regexp(r'^1[3-9]\d{9}$', message="手机号格式不正确")])submit = SubmitField('注册')
✅ Regexp(r'正则', message='错误提示')
添加正则验证
✅ 错误信息 会在 form.errors
中返回给前端
3. 在 HTML 页面显示错误
在 templates/register.html
里:
<form method="POST">{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username(size=30) }}<br>{% for error in form.username.errors %}<span style="color:red;">{{ error }}</span>{% endfor %}</p><p>{{ form.password.label }}<br>{{ form.password(size=30) }}<br>{% for error in form.password.errors %}<span style="color:red;">{{ error }}</span>{% endfor %}</p><p>{{ form.phone.label }}<br>{{ form.phone(size=30) }}<br>{% for error in form.phone.errors %}<span style="color:red;">{{ error }}</span>{% endfor %}</p><p>{{ form.submit() }}</p>
</form>
当输入不符合正则表达式时,会在页面显示错误提示。
4. 结论
Regexp()
可用于自定义格式验证(用户名、密码、手机号等)。- 错误消息 可用
message="自定义错误提示"
指定,并在前端显示。 - 配合 Flask-WTF,可以 轻松实现表单验证 并提升用户体验。
如果你有具体的表单需求,可以提供,我帮你写具体代码!🚀