Qt 正则表达式(QRegExp)
正则表达式是对字符串操作的一种逻辑公式,匹配一系列符合某个句法规则的字符串。Qt的正则表示类是QRegExp,在很多情况下都可以用到,比如字符串验证、字符串搜索、搜索并替换、字符串分割等。QRegExp 的默认匹配模式和Perl语言正则表达式类似。此外QRegExp还提供了一个简化的通配符模式(wildcard),和命令行下的匹配模式比较类似(只有?和*两个元字符)。 (1)字符和缩写: c 代表字符本身,除非是正则里面规定的特殊字符(.,^,$,[,],*,+,?)。 c 跟在反斜杠后面代表字符本身,除非一下以下几个特殊的转义符:a(铃声),f(换页),n(换行),r(回车),t(Tab),xhhhh(unicode字符) d(数字),D(非数字),s(空格),S(非空格),w(),W,n(回溯引用 ,其后跟一个非零十进制整数 d,匹配与第 d 个括号中的子表达式的匹配相同的内容) . 代表任意一个字符 (.*代表任意多个字符) 【注意】 使用反斜杠时,需注意C++里本身需要转义,所以若需要定义s,需写成"s"。 [] 匹配括号内输入的任意字符.[123]可以为1,2 或3 (2)以下符号用于数量 * + ? {}(可参考文档). * 任意数量。(匹配任意数量的前导字符. 例如,1*2可以为任意数量个1(甚至没有),后面跟一个2) + 单个数量 (匹配至少一个前导字符. 例如,1+2必须为一个或多个1,后跟一个2) ? 单个数量或为空(匹配一个前导字符或为空. 例如 1?2可以为2或这12) E{n,m},至少n个,至多m个 (3)断言: 断言不匹配任何字符,只是讲前后可能出现什么。 ^ 匹配字符串首. 例如,^12可能是123,但不能是312 b 单词边界 B 非单词边界。 (4)截取(capturing Text) 。 用括号括起来的部分可以被截取到,通过cap(0)——匹配到的整个字符串、cap(1)——第一个括号的内容、cap(n...)。 代码如下:
class RegExpUtils { public: RegExpUtils(); static bool existUrl(const QString& strText); //url正则解析,判断字符串中是否含有url static void convertRemindLink(QString& strHtml); //转换@联系人字段(类似微博@,{{@id123456|昵称}}) }; //url正则解析,判断是否含有url bool RegExpUtils::existUrl(const QString &strText) { bool bResult = false; QString strTempText = strText; //可以识别www.baidu.com、http://abc123.com等(遇到中文、空格、特殊字符则结束) QString strUrlExp = "((http|https|ftp)://|(www).)(w+)(.?[.a-z0-9/:?%&=-_+#;]*)"; //url正则 QRegExp urlRegExp(strUrlExp,Qt::CaseInsensitive); //Url正则表达式,不区分大小写 while(urlRegExp.indexIn(strTempText) != -1) { bResult = true; QString strWebUrl = urlRegExp.cap(0);//匹配到的url qDebug() << strWebUrl; //输出url int nIndex = strTempText.indexOf(strWebUrl); //索引位置 strTempText.remove(0,nIndex+strWebUrl.size()); //删除已遍历过的内容 } return bResult; //返回是否包含url } //转换@联系人字段(类似微博@,{{@id123456|昵称}},替换为超链接) void RegExpUtils::convertRemindLink(QString &strHtml) { QString strContentHtml = strHtml; QString strLink = QString("<a href='http://abc.com/link/%1'>@%2</a> "); if(!strContentHtml.isEmpty()) { QString strTempHtml = strContentHtml; //需要进行正则匹配的内容 QString strPattern("{{@([A-Za-z0-9]{1,20})|(.*)}}");//正则表达式获取@好友的字段 QRegExp remindExp; remindExp.setPattern(strPattern); remindExp.setMinimal(true); //最小匹配模式 while(remindExp.indexIn(strTempHtml) != -1) { QString strRemindTag = remindExp.cap(0); //匹配到的字符串全部内容 QString strRemindFriendId = remindExp.cap(1);//第一个括号的内容:id QString strRemindFriendName = remindExp.cap(2); //第二个括号的内容:昵称 QString strResultLink; QString strLinkName = strRemindFriendId.append("|").append(strRemindFriendName); strResultLink = strLink.arg(strLinkName).arg(strRemindFriendName); //超链接 strContentHtml.replace(strContentHtml.indexOf(strRemindTag),strRemindTag.size(),strResultLink);//替换为超链接 int nIndex = strTempHtml.indexOf(strRemindTag); strTempHtml.remove(0,nIndex + strRemindTag.size());//去掉已遍历过的内容 }/*end of while(remindExp)*/ }/*end of if(!strContentHtml)*/ strHtml = strContentHtml; //转换后的内容 } 测试: RegExpUtils::existUrl("www.baidu.com test1 http://abc123.com测试2"); QString strRemindText = "{{@id123456|user1}} 微博内容 {{@id654321|用户2}}"; qDebug() << "before convert" << strRemindText; RegExpUtils::convertRemindLink(strRemindText); qDebug() << "after convert:" << strRemindText; 输出: "www.baidu.com" "http://abc123.com" before convert "{{@id123456|user1}} 微博内容 {{@id654321|用户2}}" after convert: "<a href='http://abc.com/link/id123456|user1'>@user1</a> 微博内容 <a href='http://abc.com/link/id654321|用户2'>@用户2</a> " 演示程序下载地址(Qt5.0,Qt Creator项目): http://download.csdn.net/detail/lingyun0/8279149
参考资料 qt之正则表达式,http://blog.csdn.net/phay/article/details/7304455 正则表达式,百度百科。
By Lankin 2014/12/19 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |