Qt中正则表达式小研究整理

引入

最早接触正则表达式是在学习php的时候,要进行字符的匹配和验证,在学习Windows编程所用的课本上,正好有一个章节讲正则表达式,所以将所学习到的内容记录在博客中

正则表达式的应用方面
  1. 验证:验证字符串是否符合某一些要求
  2. 搜索:提供模式匹配
  3. 查找和替换:使用一个不同的字符串替换所有匹配的字符串
  4. 字符串分割:识别字符串在哪儿进行分割
Qt中的QregExp类实现了用正则表达式进行模式匹配,下面就针对这个类中的内容进行介绍

正则表达式介绍

组成元素

  1. 表达式:各种字符和字符组
  2. 量词
  3. 断言

    正则表达式详解

组成元素

表达式含义
\r, \n代表回车和换行符
\t制表符
\代表 “\” 本身
\^匹配 ^ 符号本身
$匹配 $ 符号本身

元字符含义
.匹配除了换行符以外的任意字符
\w匹配字母、数字、下划线、汉字
\s匹配任意的空白符
\b单词的开始或结尾
\~匹配字符串的开始
$匹配字符串的结束
正则表达式中的量词

这里写图片描述

正则表达式中的断言
断言不匹配任何字符,只是讲前后可能出现什么。

$  配字符串尾. 例如, 12$可以是312, 当不能是 123

\b 单词边界

\B 非单词边界。

文本捕获

用括号括起来的部分可以被截取到,通过cap(0)——匹配到的整个字符串、cap(1)——第一个括号的内容、cap(n…)。
class RegExpUtils  
{  
public:  
    RegExpUtils();  
    static bool existUrl(const QString& strText); //url正则解析,判断字符串中是否含有url  
    static void convertRemindLink(QString& strHtml); //转换@联系人字段(类似微博@,{{@id123456|昵称}})  
};  
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)*/  

    str
测试
 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;  

QRegularExpression类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值