JavaScript正则表达式教程:前端表单校验案例分步解析,零基础自学避坑攻略

admin javascript教程 4


做前端开发的新手是不是都遇到过这种情况?写注册表单时,用户输个 “12345” 当手机号也能提交,填个 “abc@.com” 的邮箱没提示错误,密码设成 “666” 居然也通过验证;好不容易抄了段正则代码,要么太严把正常用户拦在外面,要么太松啥错误都放过去,调试半天找不到问题在哪。别愁,兔子哥刚开始学前端表单校验时,光是手机号正则就改了三次,第一次把 177 开头的号当成错误格式,第二次又放过了带字母的 “假手机号”,踩了不少坑。今天就带零基础的朋友从基础语法到实战案例,一步步学会用 JavaScript 正则做表单校验,再把避坑攻略讲透,跟着学,轻松搞定前端验证!

一、先搞懂:JavaScript 正则到底咋写?基础符号先记这几个


JavaScript 里的正则表达式看着像 “乱码”,其实常用的符号就几个,搞明白它们,表单验证的正则就会写了。
  1. 最常用的 “通配符”:\d、\w、. 帮你匹配字符

  • \d:专门匹配数字(0-9),表单里的手机号、验证码全是数字,必须用它。比如想匹配 11 位数字,写\d{11}就行,简单又好记。
  • \w:匹配字母、数字或下划线,用户名、密码验证经常用到。比如\w{6,12}表示 6 到 12 位的字母、数字或下划线,刚好适合用户名长度。
  • .:匹配任意一个字符(除了换行),万能替补队员。比如验证密码时允许特殊符号,用.{8,}就能匹配 8 位以上的任意字符(包括字母、数字、符号)。

有朋友会问:“这些符号咋用在 JavaScript 里?” 很简单,用//把正则包起来,比如let phoneReg = /\d{11}/; 这就是一个匹配 11 位数字的正则对象。
  1. 控制长度的 “限定符”:*、+、?、{n} 别记混
    这些符号用来规定前面的字符能出现多少次,表单验证里控制长度全靠它们:

  • *:出现 0 次或多次,比如邮箱里的 “点” 可能有也可能没有,\w+(\.\w+)*就能匹配 “user”“user.name” 这类用户名。
  • +:出现 1 次或多次,确保内容不能为空。比如用户名至少 6 位,\w{6,}里的{6,}就是+的 “升级版”,表示 6 次以上。
  • ?:出现 0 次或 1 次,适合处理可选内容。比如手机号可能带 “+86” 前缀,(\+86)?\d{11}里的?就允许前缀有或没有。
  • {n}:固定出现 n 次;{n,m}:出现 n 到 m 次。比如 6 位验证码用\d{6},8-16 位密码用.{8,16},精准控制长度。

  1. ** 划清边界的 “定位符”:^、$ 别漏了**
    这俩符号超重要!^表示开头,$表示结尾,加了它们,正则才会检查整个字符串,不然可能只匹配部分内容。比如验证手机号/^\d{11}$/,加了^$\,就只能匹配刚好 11 位的数字;要是没加,用户输 “13800138000abc” 也会被当成匹配,这就错了。兔子哥第一次写正则时就漏了这俩符号,结果把带字母的手机号当成了有效格式,教训啊!

符号作用表单验证场景例子
\d匹配数字手机号、验证码/^\d {6}$/ 验证 6 位验证码
\w匹配字母 / 数字 / 下划线用户名/^\w {6,12}$/ 6-12 位用户名
.任意字符密码(含特殊符号)/.{8,16}/ 8-16 位密码
{n,m}长度范围控制输入长度/^.{2,5}$/ 2-5 位字符
^$开头结尾完整匹配检查/^\d {11}$/ 完整匹配 11 位数字

二、实战案例:3 个高频表单验证,代码直接抄着用


光懂符号没用,动手做几个案例才记得牢,这三个场景几乎每个网站都要用,代码改改就能上项目。
  1. 手机号验证:支持可选 86 前缀,过滤无效号段
    需求:11 位数字,可带 “+86” 或 “86” 前缀,第一位必须是 1,第二位是 3-9(排除 12、11 等无效号段)。
    正则表达式:/^(\+86|86)?1[3-9]\d{9}$/
    JavaScript 实现步骤:

javascript
// 获取输入框和按钮let phoneInput = document.getElementById('phone');let checkBtn = document.getElementById('checkBtn');// 点击验证checkBtn.onclick = function() {let phone = phoneInput.value;// 正则规则:可选86前缀,1开头,第二位3-9,后面9位数字let phoneReg = /^(\+86|86)?1[3-9]\d{9}$/;if (phoneReg.test(phone)) {alert('手机号格式正确!');} else {alert('请输入正确的手机号(支持+86前缀)');}};

这里的1[3-9]\d{9}是关键,确保第二位是 3-9,过滤掉 12、11 等不存在的号段,比单纯的\d{11}更严谨。
  1. 邮箱验证:支持带点用户名和多级域名
    需求:用户名可含字母、数字、下划线和点,域名支持 “qq.com”“gmail.com.cn” 这类格式,不能有连续的点或特殊符号。
    正则表达式:/^[\w.]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]{2,}(\.[a-zA-Z0-9]{2,})?$/
    JavaScript 实现:

javascript
let emailInput = document.getElementById('email');emailInput.onblur = function() { // 失去焦点时验证let email = this.value;let emailReg = /^[\w.]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]{2,}(\.[a-zA-Z0-9]{2,})?$/;if (emailReg.test(email)) {this.nextElementSibling.textContent = '邮箱格式正确';this.nextElementSibling.style.color = 'green';} else {this.nextElementSibling.textContent = '请输入正确的邮箱(如user@qq.com)';this.nextElementSibling.style.color = 'red';}};

这个正则允许用户名带点(比如 “user.name”),也支持 “com.cn” 这类二级域名,比简单的\w+@\w+\.\w+实用多了。
  1. 密码强度验证:至少 8 位,含大小写字母和数字
    需求:8-16 位,必须同时包含大写字母、小写字母和数字,可含特殊符号(提高安全性)。
    正则表达式:/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,16}$/
    JavaScript 实现:

javascript
let pwdInput = document.getElementById('password');pwdInput.oninput = function() { // 输入时实时验证let pwd = this.value;let pwdReg = /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,16}$/;if (pwdReg.test(pwd)) {document.getElementById('pwdTips').textContent = '密码强度合格';} else {document.getElementById('pwdTips').textContent = '密码需8-16位,含大小写字母和数字';}};

这里的(?=.*[A-Z])叫 “正向预查”,专门用来检查字符串里是否包含大写字母,同理检查小写字母和数字,确保密码不是简单的纯数字或纯字母。

三、避坑攻略:新手最容易踩的 5 个坑,照着改少走弯路


  1. ** 漏写 ^ 和,写成/^\d {11}$/`,确保整个字符串都是 11 位数字。
  2. 贪婪匹配导致验证范围太宽
    正则默认是 “贪婪” 的,会尽可能多匹配内容。比如验证标签时用//,可能会匹配到页面里所有的 input 标签,而不只是单个。解决方法:在*后面加?用非贪婪匹配,//就只会匹配到第一个>结束。
  3. 特殊符号没转义,正则失效
    . * + ( ) [ ]这些在正则里有特殊含义,想匹配它们本身必须加\转义。比如验证带点的 IP 地址 “192.168.1.1”,正则得写/^\d+\.\d+\.\d+\.\d+$/,把每个.转义成\.,不然.会匹配任意字符。
  4. 正则太严格,把正常用户拦住
    比如手机号正则写成/^138\d{8}$/,只能匹配 138 开头的号,139、177 开头的正常号就通不过。解决方法:查清楚规则,手机号第二位是 3-9,写成/^1[3-9]\d{9}$/,覆盖所有 valid 号段。
  5. 没考虑空值情况,空输入也通过
    用户啥都不输直接提交,正则/^.*$/会返回 true,因为.匹配任意字符(包括空)。解决方法:加非空验证,比如if(!input.value) { alert('不能为空'); return; },先判断非空再用正则验证。

四、自问自答:前端正则新手常问的 3 个问题


  1. “用正则验证还是用 if 判断?哪个更好?”
    简单验证用 if 方便,比如判断密码长度if(pwd.length < 8);但复杂规则(如同时含大小写字母、特殊格式邮箱)必须用正则,一行正则能顶十几行 if 判断,还更清晰。兔子哥建议两者结合,先 if 判断非空和长度,再用正则验证格式。
  2. “怎么实时看到正则匹配效果?有工具推荐吗?”
    推荐用 “regex101” 这个在线工具,左边输正则,右边输测试文本,能实时看到匹配结果,哪里错了一目了然。写表单正则前先在工具里测好,再放到 JavaScript 代码里,能少踩很多坑。
  3. “不同浏览器对正则支持不一样吗?需要兼容吗?”
    现在主流浏览器(Chrome、Firefox、Edge)对基础正则支持都一样,表单验证常用的符号和方法(test() match())没兼容问题,新手不用特意写兼容代码,放心用就行。

结尾心得


JavaScript 正则做表单验证,看着难其实套路很固定,记住几个核心符号,多练几个案例就会了。兔子哥的经验是,写正则别追求一步到位,先实现基础验证,再慢慢优化。比如先让手机号能匹配 11 位数字,再优化支持 86 前缀;先让邮箱能匹配 “@” 前后的内容,再支持多级域名。遇到调试不通的情况别慌,用在线工具一步步测,看看正则到底匹配了啥,很快就能找到问题。记住,前端验证的目的是帮用户少犯错,不是为难用户,正则写得灵活点,用户体验才好!

标签: 正则表达式 验证码

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~