正则表达式是对字符串操作的一种逻辑公式,匹配一系列符合某个句法规则的字符串。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
$ 配字符串尾. 例如, 12$可以是312, 当不能是 123
\b 单词边界
\B 非单词边界。
(4)截取(capturing Text) 。
用括号括起来的部分可以被截取到,通过cap(0)——匹配到的整个字符串、cap(1)——第一个括号的内容、cap(n...)。
代码如下:
- class RegExpUtils
- {
- public:
- RegExpUtils();
- static bool existUrl(const QString& strText);
- static void convertRemindLink(QString& strHtml);
- };
- bool RegExpUtils::existUrl(const QString &strText)
- {
- bool bResult = false;
- QString strTempText = strText;
-
- QString strUrlExp = "((http|https|ftp)://|(www)\\.)(\\w+)(\\.?[\\.a-z0-9/:?%&=\\-_+#;]*)"; //url正则
- QRegExp urlRegExp(strUrlExp,Qt::CaseInsensitive);
- while(urlRegExp.indexIn(strTempText) != -1)
- {
- bResult = true;
- QString strWebUrl = urlRegExp.cap(0);
-
- qDebug() << strWebUrl;
- int nIndex = strTempText.indexOf(strWebUrl);
- strTempText.remove(0,nIndex+strWebUrl.size());
- }
- return bResult;
- }
-
-
- 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);
- 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());
- }
- }
-
- 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