需求
用户需要聊天记录中含有11位的手机号码进行提醒的功能,所以需要在收到聊天消息后匹配查看是否存在手机号。如果找到然后提醒。
分析
主要的需求可以拆分为两点:
- 筛选出字符串里面的数字字符。
- 通过正则匹配数字字符是否是11位手机号码。
一开始没有进行筛选数字字符串的动作,而仅仅通过正则表达式查找11位手机号。发现像嘻嘻138830978901333五 这样超过11位的数字字符也能被匹配后。
后面先筛选数字字符串,然后再去正则匹配。
代码实现
一、筛选字符串里面的数字字符
在Qt Assistant中查找QRegExp里面有一个demo可以通过正则表达式筛选字符串中的数字字符,通过一个循环保存到QStringList里面。
cpp
QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
list << rx.cap(1);
pos += rx.matchedLength();
}
// list: ["12", "14", "99", "231", "7"]
二、通过正则匹配是否是11位手机号
通过查看手机号的号段和对应的规则,写了如下的正则表达式:
^1([358][0-9]|4[579]|6[2567]|7[0135678]|9[0123589])[0-9]{8}$
参考如下两篇文章:
- Qt判断手机号码:匹配手机号码的正则
- 最新最全的手机号验证正则表达式
后面封装函数如下:
cpp
bool HasPhoneNum(const QString& strNum)
{
QRegExp rx("\\d+");
QRegExp regx("^1([358][0-9]|4[579]|6[2567]|7[0135678]|9[0123589])[0-9]{8}$");
QRegExpValidator regs(regx,0);
QString d;
int pos = 0;
int nPos = 0;
while ((pos = rx.indexIn(strNum, pos)) != -1) {
QString strPhone = rx.cap(0);
QValidator::State res = regs.validate(strPhone, nPos);
if (QValidator::Acceptable == res) {
return true;
}
pos += rx.matchedLength();
}
return false;
}