C 11/14介绍(六)——正则表达式库(二)

std::regex及其相关对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统C 中正则表达式一直没有得到语言层面的支持,没有纳入标准库,而C 作为一门高性能语言,在后台服务的开发中,对URL资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。一般的解决方案就是使用boost的正则表达式库。而C 11正式将正则表达式的的处理方法纳入标准库的行列,从语言级上提供了标准的...

C  11/14介绍(六)——正则表达式库(二)
std::regex及其相关

对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统 C中正则表达式一直没有得到语言层面的支持,没有纳入标准库,而 C作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。

一般的解决方案就是使用 boost 的正则表达式库。而 C 11 正式将正则表达式的的处理方法纳入标准库的行列,从语言级上提供了标准的支持,不再依赖第三方。

C 11 提供的正则表达式库操作 std::string 对象,模式 std::regex (本质是 std::basic_regex)进行初始化,通过 std::regex_match 进行匹配,从而产生 std::smatch (本质是 std::match_results对象)。

考虑下面的正则表达式

  • [a-z] \.txt: 在这个正则表达式中, [a-z] 表示匹配一个小写字母,可以使前面的表达式匹配多次,因此 [a-z] 能够匹配一个小写字母组成的字符串。在正则表达式中一个 . 表示匹配任意字符,而 . 则表示匹配字符 .,最后的 txt 表示严格匹配 txt 则三个字母。因此这个正则表达式的所要匹配的内容就是由纯小写字母组成的文本文件。

std::regex_match 用于匹配字符串和正则表达式,有很多不同的重载形式。最简单的一个形式就是传入std::string 以及一个 std::regex 进行匹配,当匹配成功时,会返回 true,否则返回 false。例如:

#include <iostream>#include <string>#include <regex>int main() { std::string fnames[] = {"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"}; // 在 C中 `\` 会被作为字符串内的转义符,为使 `\.` 作为正则表达式传递进去生效,需要对 `\` 进行二次转义,从而有 `\\.` std::regex txt_regex("[a-z] \\.txt"); for (const auto &fname: fnames)  std::cout << fname << ": " << std::regex_match(fname, txt_regex) << std::endl;}

另一种常用的形式就是依次传入 std::string/std::smatch/std::regex 三个参数,其中 std::smatch 的本质其实是 std::match_results,在标准库中, std::smatch 被定义为了 std::match_results<std::string::const_iterator>,也就是一个子串迭代器类型的 match_results。使用 std::smatch可以方便的对匹配的结果进行获取,例如:

std::regex base_regex("([a-z] )\\.txt");std::smatch base_match;for(const auto &fname: fnames) { if (std::regex_match(fname, base_match, base_regex)) {  // sub_match 的第一个元素匹配整个字符串  // sub_match 的第二个元素匹配了第一个括号表达式  if (base_match.size() == 2) {std::string base = base_match[1].str();std::cout << "sub-match[0]: " << base_match[0].str() << std::endl;std::cout << fname << " sub-match[1]: " << base << std::endl;  } }}

结果:

foo.txt: 1bar.txt: 1test: 0a0.txt: 0AAA.txt: 0sub-match[0]: foo.txtfoo.txt sub-match[1]: foosub-match[0]: bar.txtbar.txt sub-match[1]: bar
源文地址:https://www.guoxiongfei.cn/csdn/7579.html