引入
最早接触正则表达式是在学习php的时候,要进行字符的匹配和验证,在学习Windows编程所用的课本上,正好有一个章节讲正则表达式,所以将所学习到的内容记录在博客中
正则表达式的应用方面
- 验证:验证字符串是否符合某一些要求
- 搜索:提供模式匹配
- 查找和替换:使用一个不同的字符串替换所有匹配的字符串
- 字符串分割:识别字符串在哪儿进行分割
Qt中的QregExp类实现了用正则表达式进行模式匹配,下面就针对这个类中的内容进行介绍
正则表达式介绍
组成元素
- 表达式:各种字符和字符组
- 量词
断言
组成元素
表达式 | 含义 |
---|---|
\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;