Qt 正则表达式(QRegExp)

来源:互联网 发布:ant maven知乎 编辑:程序博客网 时间:2024/05/18 03:22

正则表达式是对字符串操作的一种逻辑公式,匹配一系列符合某个句法规则的字符串。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...)。 

代码如下:

[cpp] view plain copy
  1. class RegExpUtils  
  2. {  
  3. public:  
  4.     RegExpUtils();  
  5.     static bool existUrl(const QString& strText); //url正则解析,判断字符串中是否含有url  
  6.     static void convertRemindLink(QString& strHtml); //转换@联系人字段(类似微博@,{{@id123456|昵称}})  
  7. };  

[cpp] view plain copy
  1.   
[cpp] view plain copy
  1. //url正则解析,判断是否含有url  
[cpp] view plain copy
  1. bool RegExpUtils::existUrl(const QString &strText)  
  2. {  
  3.     bool bResult = false;  
  4.     QString strTempText = strText;  
  5.     //可以识别www.baidu.com、http://abc123.com等(遇到中文、空格、特殊字符则结束)  
  6.     QString strUrlExp = "((http|https|ftp)://|(www)\\.)(\\w+)(\\.?[\\.a-z0-9/:?%&=\\-_+#;]*)"; //url正则  
  7.     QRegExp urlRegExp(strUrlExp,Qt::CaseInsensitive); //Url正则表达式,不区分大小写  
  8.     while(urlRegExp.indexIn(strTempText) != -1)  
  9.     {  
  10.         bResult = true;  
  11.         QString strWebUrl = urlRegExp.cap(0);//匹配到的url  
  12.   
  13.         qDebug() << strWebUrl; //输出url  
  14.         int nIndex = strTempText.indexOf(strWebUrl); //索引位置  
  15.         strTempText.remove(0,nIndex+strWebUrl.size()); //删除已遍历过的内容  
  16.     }  
  17.     return bResult; //返回是否包含url  
  18. }  
  19.   
  20. //转换@联系人字段(类似微博@,{{@id123456|昵称}},替换为超链接)  
  21. void RegExpUtils::convertRemindLink(QString &strHtml)  
  22. {  
  23.     QString strContentHtml = strHtml;  
  24.     QString strLink = QString("<a href='http://abc.com/link/%1'>@%2</a> ");  
  25.     if(!strContentHtml.isEmpty())  
  26.     {  
  27.         QString strTempHtml = strContentHtml; //需要进行正则匹配的内容  
  28.         QString strPattern("\\{\\{@([A-Za-z0-9]{1,20})\\|(.*)\\}\\}");//正则表达式获取@好友的字段  
  29.         QRegExp remindExp;  
  30.         remindExp.setPattern(strPattern);  
  31.         remindExp.setMinimal(true); //最小匹配模式  
  32.   
  33.         while(remindExp.indexIn(strTempHtml) != -1)  
  34.         {  
  35.             QString strRemindTag = remindExp.cap(0); //匹配到的字符串全部内容  
  36.             QString strRemindFriendId = remindExp.cap(1);//第一个括号的内容:id  
  37.             QString strRemindFriendName = remindExp.cap(2); //第二个括号的内容:昵称  
  38.   
  39.             QString strResultLink;  
  40.             QString strLinkName = strRemindFriendId.append("|").append(strRemindFriendName);  
  41.             strResultLink = strLink.arg(strLinkName).arg(strRemindFriendName); //超链接  
  42.   
  43.             strContentHtml.replace(strContentHtml.indexOf(strRemindTag), strRemindTag.size(), strResultLink);//替换为超链接  
  44.             int nIndex = strTempHtml.indexOf(strRemindTag);  
  45.             strTempHtml.remove(0,nIndex + strRemindTag.size());//去掉已遍历过的内容  
  46.         }/*end of while(remindExp)*/  
  47.     }/*end of if(!strContentHtml)*/  
  48.   
  49.     strHtml = strContentHtml; //转换后的内容  
  50. }  

测试:

[cpp] view plain copy
  1.  RegExpUtils::existUrl("www.baidu.com test1 http://abc123.com测试2");  
  2. QString strRemindText = "{{@id123456|user1}} 微博内容 {{@id654321|用户2}}";  
  3. qDebug() << "before convert" << strRemindText;  
  4. RegExpUtils::convertRemindLink(strRemindText);  
  5. 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