C++11标准支持正则表达式后,使用正则表达式查找、提取、替换字符串就无需使用第三方开源库。

使用正则表达式包含头文件 # ,其主要包含三个类(regex、、)和三个API(()、()、()),基本可以满足使用的要求,其它都只是变种而已。

正则表达式制表符_正则表达式教程_表达式正则教程pdf

类regex,用来存放正则表达式,其实就是一个字符串,只需关心构造函数,其需要一个字符串作为参数进行对象构造。正则表达式语法遵循标准。

类,用来存放查找、提取操作的结果,其实就是一个的数组,正则表达式语法支持使用括号来获得某个子匹配,所以匹配结果会有多个,第一个存完整匹配结果,其它存正则表达式指定的子匹配。通过size()获取数组大小,操作符[]指定下标获取元素,也可以通过迭代器begin()、end()来遍历数组。()和()是获取查找结果前面和后面的字符串,比如“I am a good boy”查找am关键词,()就是“I ”,()就是“ a good boy”。

类,用来存放某个匹配,其实就是一个字符串,其重载了操作符(),所以可以当对象来使用,()返回匹配内容的长度,str()返回匹配的内容。

查找字符串使用() API,其有两个版本:

1、bool regex_search(string s, regex e);
2、bool regex_search(string s, smatch m, regex e);

第1个版本简单判断是否找到,指定搜索字符串和查找正则表达式

第2个版本除了判断是否找到外,还可以指定对象获取查找结果。

匹配字符串使用() API,其跟()区别在于前者是完全匹配不能有冗余的字符,后者可以有冗余字符。比如字符串 ,对于正则表达式sub来说,()是失败的,因为尾部没有被匹配到,()是成功的。其函数原型与()一样。

替换字符串使用() API

string regex_replace(string s, regex e, string fmt);

第一、二参数与一样,第三个参数要替换的内容,字符串里面支持使用$符号后面加数字,用来表示第几个子匹配的内容。

下面代码示例演示如何使用C++11的regex API,理解透该示例代码,你就基本掌握了其使用方法。

#include 
#include 
#include 
 
int main()
{
    const std::string s = "this subject has a submarine as a subsequence";
    const std::regex e("\b(sub)([^ ]*)");  // sub开头的单词
 
    // 只要查找是否有sub开头的单词
    if (std::regex_search(s, e))
    {
        std::cout << "the source string contains word beginning by sub" << std::endl;
    }
 
    // 查找所有sub开头的单词,并打印出来
    std::smatch m;  //存放查找结果
    std::string s2 = s;
    while (std::regex_search(s2, m, e))
    {
        for (auto x : m)  // 正则表达式有两个括号,m共有3个元素
        {
            std::cout << x << " ";
        }
        std::cout << std::endl;
        s2 = m.suffix();  // 指向查找结果的下一个位置,继续查找
    }
 
    // 只要判断是否匹配
    if (!std::regex_match(s, e))  // 要求完全匹配,这点跟查找不同
    {
        std::cout << "the source string is not match" << std::endl;
    }
 
    // 如果匹配,输出匹配结果
    std::regex e2("(.*)sub(.*)");  // 含有关键词sub,并提取sub前和sub后的内容
    if (std::regex_match(s, m, e2)) // 匹配成功了,m对象才是有效存放提取内容
    {
        for (unsigned i = 1; i < m.size(); i++)  // 第1个元素就是s,这里就不打印
        {
            // 注意:因为正则表达式.*是尽可能的去匹配,所以关键词sub匹配的是
            // 最后一个单词subsequence的sub
            std::cout << m[i] << std::endl;  
        }
    }
 
    // 把subsequence替换成sub-sequence
    std::regex e3("subsequence");    
    std::cout << std::regex_replace(s, e3, "sub-sequence") << std::endl;
 
    // 把所有sub开头的单词,在sub后面加-
    // $2匹配结果smatch中第2个元素,也就是sub后面的内容
    std::cout << std::regex_replace(s, e, "sub_$2") << std::endl;
}

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666

声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!