/^1[3-9]d{9}$/即可匹配2026年所有正规手机号:11位、以1开头、第二位3–9、后接9位数字;微信小程序pattern属性不支持非捕获组,需用RegExp字面量,name/v-model/rules键名须严格一致。

直接用 /^1[3-9]d{9}$/ 就够了,别写复杂分组
2026 年国内所有正规手机号都满足这个规则:11 位、以 1 开头、第二位是 3–9、后面跟 9 个数字。不用再拆成 13|14|15|17|18|19 去枚举,更别用 (?:3|4|5|7|8|9) 这类非捕获组——微信小程序真机环境下 pattern 属性不支持。
常见错误写法:
-
/^((13[0-9])|(14[0-9])|(15[0-9])|(17[0-9])|(18[0-9]))d{8}$/:漏掉19x号段,且总长度算错(实际是 11 位,这个表达式匹配的是 11 位但逻辑冗余) -
/^1[3456789]d{9}$/:虽然能用,但6目前无商用号段,纯属冗余,可读性和维护性不如[3-9]
uni-forms 里配 pattern 要用 RegExp 字面量,别传字符串
在 rules 对象中,如果写成 pattern: '^1[3-9]\d{9}$',JS 会把 d 当作字面反斜杠 + d,导致正则失效。必须写成 RegExp 字面量:
rules: {
mobile: {
rules: [{
pattern: /^1[3-9]d{9}$/,
errorMessage: '手机号格式不正确'
}]
}
}
另外注意:name 属性值、v-model 绑定路径、rules 的键名三者必须完全一致。比如 ,那 v-model 得是 formData.mobile,且 rules.mobile 必须存在。
手写校验时,先判空再判正则,顺序不能反
用户可能只输了一位就点提交,这时候 /^1[3-9]d{9}$/.test('1') 返回 false,但错误提示不该是“手机号格式不正确”,而应是“请输入手机号”。所以逻辑要分两层:
- 先检查是否为空或空白字符串:
!this.formData.mobile?.trim() - 再检查正则:
!/^[1][3-9]d{9}$/.test(this.formData.mobile) - 真机调试时,
type="number"的可能自动补零或丢前导 1,建议统一用type="text"+inputmode="numeric"
微信小程序里错误提示不会自动显示,得手动接 @validate
uni-forms-item 默认不渲染 errorMessage,尤其在微信小程序里。你得自己加提示节点,并监听验证状态:
<uni-forms-item name="mobile"><uni-easyinput v-model="formData.mobile"></uni-easyinput><text class="error" v-if="errors.mobile">{{ errors.mobile }}</text></uni-forms-item>
然后在 methods 或 setup 里定义 errors 响应式对象,并在 @validate 事件回调中更新它。漏掉这步,用户根本看不到错在哪。
最常被忽略的其实是嵌套 model 和 name 不对齐的问题,比如 v-model="user.info.mobile" 却设 name="mobile",这时 uni-forms 根本找不到字段,验证直接跳过。这种问题在真机上极难复现,但一出就是静默失败。











