c++ 正则表达式

原创 2013年12月05日 20:34:26

正则表达式是常用的一种方法。比较有名的类库是boost,但是这个类库在重了。所有就像找一些轻量级的类库。

后来发现准标准的库tr1已经很方便了,微软vs2008 sp1 以上版本都支持了。所有就直接用它很方便了。

而且支持unicode编码,还是很方便的。

例子:

#include <iostream>  
#include <string>  
#include <regex>  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    std::locale loc("");  
    std::wcout.imbue(loc);  
  
    std::wstring text(_T("我的IP地址是:109.168.0.1."));  
    std::wstring newIP(_T("127.0.0.1"));  
    std::wstring regString(_T("(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"));  
  
    // 表达式选项 - 忽略大小写  
    std::regex_constants::syntax_option_type fl = std::regex_constants::icase;  
      
    // 编译一个正则表达式语句  
    std::wregex regExpress(regString, fl);  
  
    // 保存查找的结果  
    std::wsmatch ms;  
  
    // 判断是否全行匹配  
    if(std::regex_match(text, ms, regExpress))  
    {  
        std::wcout<<_T("正则表达式:")<<regString<<_T("匹配:")<<text<<_T("成功.")<<std::endl;  
    }  
    else  
    {  
        std::wcout<<_T("正则表达式:")<<regString<<_T("匹配:")<<text<<_T("失败.")<<std::endl;  
    }  
  
    // 查找  
    if(std::regex_search(text, ms, regExpress))  
    {  
        std::wcout<<_T("正则表达式:")<<regString<<_T("查找:")<<text<<_T("成功.")<<std::endl;  
        for(size_t i= 0; i < ms.size(); ++i)  
        {  
            std::wcout<<_T("第")<<i<<_T("个结果:\"")<<ms.str(i)<<_T("\" - ");  
            std::wcout<<_T("起始位置:")<<ms.position(i)<<_T("长度")<<ms.length(i)<<std::endl;  
        }  
        std::wcout<<std::endl;  
  
        // 替换1  
        text = text.replace(ms[0].first, ms[0].second, newIP);  
        std::wcout<<_T("替换1后的文本:")<<text<<std::endl;  
    }  
    else  
    {  
        std::wcout<<_T("正则表达式:")<<regString<<_T("查找:")<<text<<_T("失败.")<<std::endl;  
    }  
  
    // 替换2  
    newIP = _T("255.255.0.0");  
    std::wstring newText = std::regex_replace( text, regExpress, newIP);  
    std::wcout<<_T("替换2后的文本:")<<newText<<std::endl;  
  
    // 结束  
    std::wcout<<_T("按回车键结束...");  
    std::wcin.get();  
    return 0;  

}

循环取:

std::regex_constants::syntax_option_type fl = std::regex_constants::icase;      
const std::tr1::regex pattern("http://[^\\\"\\>\\<]+?\\.(png|jpg|bmp)",fl);       
std::tr1::smatch result;      
std::string::const_iterator itS = strHtml.begin();  
std::string::const_iterator itE = strHtml.end();      
while(regex_search(itS,itE, result, pattern))//如果匹配成功  
{          
    //m_clbRegex.AddString((CString)result[0].str().c_str());           
    m_clbRegex.AddString((CString)(string(result[0].first,result[0].second)).c_str());          
    itS=result[0].second;//新的位置开始匹配      
}  

[代码说明]
1. 创建正则表达式对象,有3中方法:
(1) 使用构造函数
std::regex_constants::syntax_option_type fl = std::regex_constants::icase; // 语法选项,可以设置使用哪种风格的正则表达式语法等.
std::wregex regExpress(regString, fl);
(2) 使用赋值运算符,缺点是不能指定语法选项,而且也比较低效.
std::wregex regExpress;
regExpress = regString;
(3) 使用assign方法.
std::wregex regExpress;
regExpress.assign(regString, fl);
构造正则对象的过称就是所谓的"编译".

2. regex_match() 和 regex_search()
regex_match()只有在整个字符串匹配正则表达式时才返回 true, 而 regex_search()在子串匹配就返回 true.

3. 匹配结果对象 std::wsmatch.
熟悉Perl正则表达式的人都知道,匹配成功后可以用 $1 $2 ... $N 来获得子串的指, tr1 regex库把匹配结果保存在一个 std::wsmatch(UNICODE) / std::smatch(ANSI) 对象中.
std::wsmatch 是一个由若干个 std::wssub_match 对象构成的数组. 而 std::wssub_match 派生自 pair.
由std::wssub_match::first保存子串的起始位置指针(其实说是迭代器比较准确一点).
由std::wssub_match::second保存子串的结束位置 +1 的指针(STL的通用原则,半开区间).
所以 [std::wssub_match::first,std::wssub_match::second) 就是子串的全部内容.
当然, std::wsmatch (match_result模版的预定义类) 提供了一些简便的方法用于访问子串:
(1) str(idx) 方法返回对应的子串的 std::string / std::wstring 对象. 只是最常用的.
(2) position(idx) 方法返回对应子串的起始偏移量.(不是指针,是相对于首字节地址或者begin()的偏移量).
(3) length(idx) 返回子串的长度.

4. 替换子串.
前面说到 std::wssub_match::first / second 保存了子串的起始/结束位置,那么我们当然可以用这个指针(迭代器)来替换文本(见代码中的 "替换1").
或者用 std::regex_replace() 也可以达到目的(见代码中的"替换2").


几个常用的表达式:

 "\\b1[35][0-9]\\d{8}|147\\d{8}|1[8][01236789]\\d{8}\\b";//手机号
 "\\b0\\d{2,3}\\-?\\d{7,8}\b"; //座机
 "\\b[1-9]\\d{5}(?:19|20)\\d{2}(?:0[1-9]|[1][012])(?#月)(?:0[1-9]|[12][0-9]|[3][01])(?#日)\\d{3}[\d|X|x]\\b"; //18位身份证
 "\\b[1-9]\\d{7}(?:0[1-9]|[1][012])(?#月)(?:0[1-9]|[12][0-9]|[3][01])(?#日)\\d{3}\\b"; //15位身份证
"\\b(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\b";  //ip4
"\\b(?:[a-zA-Z0-9_-])+@(?:[a-zA-Z0-9_-])+(?:\\.[a-zA-Z0-9_-]{2,3}){1,2}\\b"; //邮箱


C++正则表达式的使用

C++里面使用正则表达式一般有三种:C regex,C ++regex,boost regex C regex 的速度是最快的 C++ regex 速度一般 boost regex 速...

正则表达式简介及在C++11中的简单使用

正则表达式简介及在C++11中的简单使用

C++学习笔记--正则表达式

C++11新增了正则表达式库regex,它的用法与python中正则表达式的用法不同,下面是使用C++正则表达式需要掌握的几个类。1 regex库中定义的几个类regex ...
  • du_qi
  • du_qi
  • 2016年09月15日 15:06
  • 571

c++实现正则表达式匹配

c++11之后封装了自己的正则表达式,直接包含文件即可使用,利用regex类声明对象初始化正则表达式,regex expressionName (“正则表达式”);正则表达式具体语法参考这里;rege...
  • bwangk
  • bwangk
  • 2016年09月25日 22:39
  • 1844

C++标准库中正则表达式简介

C++标准库中正则表达式的使用                                                                                    ...

C++ regex 正则表达式的使用

在c++中,有三种正则可以选择使用,C ++regex,C regex,boost regex ,如果在windows下开发c++,默认不支持后面两种正则,如果想快速应用,显然C++ regex 比较...
  • cwqcwk1
  • cwqcwk1
  • 2014年02月09日 19:32
  • 26671

正则表达式

一、正则表达式的概念及特点:   正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻...

C++正则表达式

环境:win732位旗舰版、VS2010旗舰版

C++中的也能使用正则表达式

C++中的也能使用正则表达式 http://www.cnblogs.com/ittinybird/p/4853532.html       正则表达式Regex(regular e...

C++正则表达式

C++正则表达式regexC正则表达式regex组件 使用正则表达式库 test1查找违法拼写规则i除非在c后否则必须在e前的单词 指定regex对象的选项 test2匹配指定后缀的文件名字 指定使用...
  • qlb7707
  • qlb7707
  • 2016年07月19日 16:56
  • 699
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ 正则表达式
举报原因:
原因补充:

(最多只允许输入30个字)