1. 匹配
根底用法:
#include <iostream>#include <string>#include <regex>int main(){ using namespace std::regex_constants; std::string filename("Foo.txt"); std::regex pattern("[a-z]+\\.txt", ECMAScript|icase); // icase: 疏忽大小写 // filename 是否匹配 pattern bool matched = std::regex_match(filename, pattern); std::cout << std::boolalpha << matched; // true}
提取子匹配(分组):
std::string filename("foo.txt");std::regex pattern("([a-z]+)\\.([a-z]+)");std::smatch groups;// 如果 filename 匹配 pattern,则将匹配后果存入 groups 中bool matched = std::regex_match(filename, groups, pattern);if (matched){ for (size_t i = 0; i < groups.size(); i++) { /* groups[0] 是整个匹配的内容; groups[1] 是第一匹配分组的内容,以此类推。 */ std::ssub_match group = groups[i]; std::cout << "groups[" << i << "]: " << group.str() << '\n'; }}
groups[0]: foo.txtgroups[1]: foogroups[2]: txt
2. 搜寻
根底用法:
std::string s("Roses are #ff0000, violets are #0000ff.");std::regex pattern("#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})");std::smatch groups;auto itBegin = s.cbegin(), itEnd = s.cend();// 在 [itBegin, itEnd) 中搜寻匹配 pattern 的内容,并将匹配后果存入 groups 中while (std::regex_search(itBegin, itEnd, groups, pattern)){ for (size_t i = 0; i < groups.size(); i++) { /* groups[0] 是整个匹配的内容; groups[1] 是第一匹配分组的内容,以此类推。 */ std::ssub_match group = groups[i]; std::cout << "groups[" << i << "]: " << group.str() << '\n'; } std::cout << "---------------\n"; // 第 0 个匹配分组的范畴:[groups[0].first, groups[0].second) itBegin = groups[0].second;}
groups[0]: #ff0000groups[1]: ffgroups[2]: 00groups[3]: 00---------------groups[0]: #0000ffgroups[1]: 00groups[2]: 00groups[3]: ff---------------
应用正则迭代器来遍历所有匹配的内容:
std::string s("Roses are #ff0000, violets are #0000ff.");std::regex pattern("#[a-f0-9]{6}");auto itBegin = std::sregex_iterator(s.begin(), s.end(), pattern);auto itEnd = std::sregex_iterator();for (auto it = itBegin; it != itEnd; it++){ // 指向 std::smatch 类型 std::cout << it->str() << '\n';}
#ff0000#0000ff
3. 替换
std::string s("phone number and qq number: 123456789, 987654321.");std::regex pattern("([0-9]+),\\s+([0-9]+)");// 将 s 中匹配 pattern 的内容替换成 [$&]// $&: 援用整个匹配的内容std::string result = std::regex_replace(s, pattern, "[$&]");std::cout << result << '\n';// $1: 援用第一个匹配分组的内容,以此类推result = std::regex_replace(s, pattern, "$2, $1");std::cout << result << '\n';
phone number and qq number: [123456789, 987654321].phone number and qq number: 987654321, 123456789.
4. smatch
using smatch = match_results<string::const_iterator>;
std::smatch groups;std::size_t n = groups.size(); // 有多少个匹配分组(包含整个匹配)int len = groups.length(1); // 第一个匹配分组的长度int pos = groups.position(1); // 第一个匹配分组的起始地位std::string s = groups.str(1); // 第一个匹配分组的字符串示意std::ssub_match group = groups[1]; // 第一个匹配分组std::ssub_match prefix = groups.prefix(); // 匹配内容之前的内容std::ssub_match suffix = groups.suffix(); // 匹配内容之后的内容// 迭代器for (auto it = groups.cbegin(); it != groups.cend(); it++){ std::ssub_match group = *it;}
5. ssub_match
using ssub_match = sub_match<string::const_iterator>;
std::ssub_match group;auto itBegin = group.first; // 匹配分组的起始地位(迭代器)auto itEnd = group.second; // 匹配分组的尾后地位(迭代器)auto len = group.length(); // 匹配分组的长度std::string s = group.str(); // 匹配分组的字符串示意