Qt中使用正则验证QLineEdit邮箱与手机号输入问题咨询
基础邮箱与手机号正则验证方案(适配QLineEdit实时输入)
我懂你遇到的问题了——之前用的正则太严格,导致用户输入过程中每一步都被判定为无效,直接锁死输入框对吧?毕竟QLineEdit的实时验证会在每敲一个字符时检查,那种要求完全匹配最终格式的正则肯定不适合输入过程。给你两套适配实时输入的基础验证正则,刚好满足你的需求:
一、基础邮箱验证正则
基础需求的话,咱们只需要确保输入符合“前缀@域名.后缀”的大致结构就行,不用纠结复杂的域名规则。下面这个正则支持用户逐步输入(比如先输前缀、再输@、再输域名的过程都不会被拦截):
^[A-Za-z0-9._%+-]*@?[A-Za-z0-9.-]*\.?[A-Za-z]*$
简单解释下规则:
- 允许前缀输入合法字符(字母、数字、._%+-),可以为空(方便用户先敲@)
@?表示@符号可选(用户输入到@之前的状态也合法)- 域名部分允许字母、数字、.-,同样可以为空
- 后缀的点号和字母都可选,适配用户还没输完后缀的情况
如果想要稍微严格一点(比如要求前缀至少有一个字符),可以用这个:
^[A-Za-z0-9._%+-]+@?[A-Za-z0-9.-]*\.?[A-Za-z]{2,}?$
这里把前缀的*改成+,强制前缀至少有一个字符,后缀要求至少2个字符但暂时允许为空(方便输入过程)。
二、基础手机号验证正则
针对国内手机号的话,基础规则就是1开头,第二位是3-9,后面跟着9位数字。下面这个正则支持实时输入:
^1[3-9]?[0-9]{0,9}$
解释:
- 强制以1开头
[3-9]?允许第二位暂时为空(用户刚输入1时不会被拦截)[0-9]{0,9}允许后面输入0到9位数字,完美适配从1位到11位的输入过程
如果需要支持带国际区号(比如+86)的情况,用这个:
^(\+86)?1?[3-9]?[0-9]{0,9}$
允许开头的+86可选,也允许用户先输区号再输手机号。
三、QLineEdit里的使用小技巧
别直接用完全匹配的正则硬套,要用QRegExpValidator来做实时验证,它会允许输入过程中的中间状态。举个代码例子:
// 邮箱输入框验证 QRegExp emailRegex("^[A-Za-z0-9._%+-]*@?[A-Za-z0-9.-]*\\.?[A-Za-z]*$"); QRegExpValidator *emailValidator = new QRegExpValidator(emailRegex, this); ui->emailLineEdit->setValidator(emailValidator); // 手机号输入框验证 QRegExp phoneRegex("^1[3-9]?[0-9]{0,9}$"); QRegExpValidator *phoneValidator = new QRegExpValidator(phoneRegex, this); ui->phoneLineEdit->setValidator(phoneValidator);
要是你想在用户输入完成(比如输入框失去焦点)时做最终的严格检查,可以再用一套完全匹配的正则二次验证:
- 邮箱完全匹配:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ - 手机号完全匹配:
^1[3-9][0-9]{9}$
内容的提问来源于stack exchange,提问作者KelvinS
相关产品推荐
相关产品推荐

