c++正则表达式简单总结

本文学习自C++与正则表达式入门 - RioTian (cnblogs.com)

1.regex_match

2.regex_search

3.regex_replace

这三个函数是正则表达式的核心,它们会运行正则表达式引擎完成匹配,查找和替换任务。

这里我主要简单记录一下regex_replace函数,后续的学习在更新新的内容。

string s = "ab123cdef"; //
regex ex("\\d+");    //

string r = regex_replace(s, ex, "xxx"); //

cout << r << endl; //

这里用大佬的代码简单进行一下说明,

  1. 前面这个是字符串
  2. 第二行是正则表达式
  3. 通过regex_replace完成替换
  4. 通过cout输出结果

最终输出的字符串如下:

abxxxcdef

主要是这行代码:

string r = regex_replace(s, ex, "xxx");

括号里的 s 是要替换的字符串,ex则是之前写好的正则表达式,“xxx”是替换掉的内容;

正则表达式也可以写在括号里面

string r = regex_replace(s, regex("\\d+");, "xxx");

下面再用今天做的题来说一下特定的操作。

L1-8 估值一亿的AI核心代码 (20 分)

  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 I 和 me 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !

主要执行的是以上几个操作,代码如下

        s = regex_replace(s, regex(R"(\s+)"), " ");
        if(s.front() == ' ') s.erase(s.begin());
        if(s.back() == ' ') s.pop_back();
        s = regex_replace(s, regex(R"( \!)"), "!"); 
        s = regex_replace(s, regex(R"( \,)"), ","); 
        s = regex_replace(s, regex(R"( \.)"), ".");
        s = regex_replace(s, regex(R"( \?)"), "?");
        s = regex_replace(s, regex(R"( \')"), "'");
        for (auto &c : s) {
            if(c != 'I') c = tolower(c);
        }
        s = regex_replace(s, regex(R"(\bcan you\b)"), "_I can");
        s = regex_replace(s, regex(R"(\bcould you\b)"), "_I could");   
        s = regex_replace(s, regex(R"(\bI\b)"), "you");
        s = regex_replace(s, regex(R"(\bme\b)"), "you");
        s = regex_replace(s, regex(R"(\?)"), "!");
        s = regex_replace(s, regex(R"(\b_I\b)"), "I"); 

首先解释一下R的含义,简单的说R指,这种表达式是告诉编译器:这里的内容是纯字符串,因此不再需要增加反斜杠来转义特殊字符。

因为正则表达式本身也有一些字符需要转义。然后解释代码含义

1.regex(R"(\s+)")  \s指的是空白字符,后面跟的’+‘是指这个空白字符有1个或者多个,后面的“ ”,则是替换的字符。

2.regex(R"( \!)")  这是要把(空格)!替换成!,后面的都是同样的写法。

3.regex(R"(\bcan you\b)"),\b指的是单词边界,例如:正则表达式some\b在字符串"some birds"中能找到匹配,在字符串"sometimes wonderful"中却找不到。后面也都是同样的写法。

4.

s = regex_replace(s, regex(R"(\bcan you\b)"), "_I can");中的“_I can”下划线是为了与下面的I区分,另外如果先置换I变成you,会出现can I替换错误的情况

小结:

正则表达式的东西确实太多了,我这里只是简单的说明了一下特定情况下的用法,后面再详细总结一下吧。

 

posted @ 2022-03-01 21:28  i天天开心  阅读(246)  评论(1编辑  收藏  举报