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; // ④
这里用大佬的代码简单进行一下说明,
- 前面这个是字符串
- 第二行是正则表达式
- 通过
regex_replace
完成替换 - 通过
cout
输出结果
最终输出的字符串如下:
abxxxcdef
主要是这行代码:
string r = regex_replace(s, ex, "xxx");
括号里的 s 是要替换的字符串,ex则是之前写好的正则表达式,“xxx”是替换掉的内容;
正则表达式也可以写在括号里面
string r = regex_replace(s, regex("\\d+");, "xxx");
下面再用今天做的题来说一下特定的操作。
- 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
- 把原文中所有大写英文字母变成小写,除了
I
; - 把原文中所有独立的
can you
、could you
对应地换成I can
、I 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替换错误的情况
小结:
正则表达式的东西确实太多了,我这里只是简单的说明了一下特定情况下的用法,后面再详细总结一下吧。