C++ Primer 5th笔记(chap 17 标准库特殊设施)regex_replace

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 17 标准库特殊设施)regex_replace相关的知识,希望对你有一定的参考价值。

1. 定义

在输入序列中查找并替换一个正则表达式

操作解释
m.format(dest, fmt, mft), m.format(fmt, mft)使用格式字符串fmt生成格式化输出,匹配在m中,可选的match_flag_type标志在mft中。第一个版本写入迭代器dest指向的目的为止,并接受fmt参数,可以是一个string,也可以是一个指向空字符结尾的字符数组的指针。mft的默认值是format_default。
rege_replace(dest, seq, r, fmt, mft), regex_replace(seq, r, fmt, mft)遍历seq,用regex_search查找与regex对象r相匹配的子串,使用格式字符串fmt和可选的match_flag_type标志来生成输出。mft的默认值是match_default

eg.

string phone = "(\\\\()?(\\\\d{3})(\\\\))?([-. ])?(\\\\d{3})([-. ]?)(\\\\d{4})"
string fmt = "$2.$5.$7";  // 将号码格式改为ddd.ddd.dddd
regex r(phone);  // 用来寻找模式的regex对象
string number = "(908) 555-1800";
cout << regex_replace(number, r, fmt) << endl;

输出为:

908.555 . 1800

只替换输入序列的一部分

正则表达式更有意思的一个用处是替换一个大文件中的电话号码。

eg.

有一个保存人名及其电话号码的文件:
morgan (201) 555-2368 862-555-0123
drew (973) 555.0130
lee (609) 555-0132 2015550175 800.555-0000

我们希望将数据转换为下面这样:
morgan 201.555. 2368 862.555 . 0123
drew 973.555 . 0130
lee 609.555 . 0132 201.555 . 0175 800.555 . 0000
int main ( )
{
	string phone = "(\\\\()?(\\\\d{3})(\\\\))?([-. ])?(\\\\d{3})([-. ]?)(\\\\d{4})";
	regex r (phone); // 寻找模式所用的 regex 对象
	smatch m;
	string s;
	string fmt = "$2.$5.$7"; //将号码格式改为 ddd.ddd.dddd
	
	// 从输入文件中读取每条记录
	while (getline (cin, s))
	    cout << regex_replace (s, r, fmt) << endl;
	return 0;
}

以上是关于C++ Primer 5th笔记(chap 17 标准库特殊设施)regex_replace的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 17 标准库特殊设施)输出补白

C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset类型

C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式

C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 返回多个值

C++ Primer 5th笔记(chap 17 标准库特殊设施)控制输入格式

C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset操作