65.9K
CodeProject 正在变化。 阅读更多。
Home

C++ TR1 正则表达式快速入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (22投票s)

2008 年 5 月 22 日

BSD

3分钟阅读

viewsIcon

98608

本文回答了在使用 C++ TR1 中的正则表达式时出现的一些初步问题。

引言

正则表达式语法在许多环境中都非常相似。然而,你使用正则表达式的方式却大相径庭。例如,一旦你编写了你的正则表达式,你如何使用它来查找匹配或替换文本?一旦你知道要查找哪个 API,就很容易找到详细的 API 文档。弄清楚从哪里开始往往是最困难的部分。

本文假设你熟悉正则表达式,并且希望使用 C++ 中的正则表达式,使用 C++ 标准库的 Technical Report 1 (TR1) 扩展。这是一个快速入门指南,简要回答你可能首先会问的一些问题。有关更多详细信息,请参阅 C++ TR1 正则表达式入门,或者深入研究你的实现附带的文档。

快速入门问题

问:在哪里可以获得 TR1?

答:Visual Studio 2008 中对 TR1 扩展的支持作为 功能包 添加。其他实现包括 BoostDinkumwareGNU 编译器 gcc 在 4.3.0 版本中增加了对 TR1 正则表达式的支持。

问:支持哪些正则表达式风格?

答:这取决于你的实现。 Visual Studio 2008 支持以下选项:basic, extended, ECMAScript, awk, grep, egrep

问:我应该包含哪个头文件?

答:<regex>

问:东西在哪个命名空间中?

答:std::tr1

这是 regex 类和 regex_search 等函数的命名空间。 标志包含在嵌套的命名空间 std::tr1::regex_constants 中。

问:我如何进行匹配?

答:构造一个 regex 对象并将其传递给 regex_search

例如

std::string str = "Hello world";
std::tr1::regex rx("ello");
assert( regex_search(str.begin(), str.end(), rx) );

函数 regex_search 返回 true,因为 str 包含模式 ello。请注意,regex_match 在上面的示例中将返回 false,因为它测试整个 string 是否与正则表达式匹配。 regex_search 的行为更像大多数人期望在测试匹配时那样。

问:如何检索匹配项?

答:使用 regex_search 的一种形式,该形式将 match_result 对象作为参数。

例如,以下代码搜索 <h> 标签并打印级别和标签内容。

std::tr1::cmatch res;
str = "<h2>Egg prices</h2>";
std::tr1::regex rx("<h(.)>([^<]+)");
std::tr1::regex_search(str.c_str(), res, rx);
std::cout << res[1] << ". " << res[2] << "\n";

此代码将打印 2. Egg prices。 该示例使用 cmatch,这是库为 match_results<const char* cmatch> 提供的 typedef

问:我如何进行替换?

答:使用 regex_replace

以下代码将用“planet”替换字符串“Hello world”中的“world”。 字符串 str2 将包含“Hello planet”,而 string str 将保持不变。

std::string str = "Hello world";
std::tr1::regex rx("world");
std::string replacement = "planet";
std::string str2 = std::tr1::regex_replace(str, rx, replacement);

请注意,与 Perl 命令 s/world/planet/ 不同,regex_replace 不会更改其参数。 还要注意,regex_replace 的第三个参数必须是一个 string 类,而不是一个 string 字面量。

问:我如何进行全局替换?

答:默认情况下,函数 regex_replace 执行全局替换。

问:我如何避免进行全局替换?

答:将 format_first_only 标志与 regex_replace 一起使用。

该标志的完全限定名称是 std::tr1::regex_constants::format_first_only,并且将是 regex_replace 的第四个参数。

问:我如何使正则表达式不区分大小写?

答:将 icase 标志用作 regex 构造函数的参数。

该标志的完全限定名称是 std::tr1::regex_constants::icase

历史

  • 2008 年 5 月 22 日:初始帖子
  • 2008 年 5 月 23 日:添加示例
© . All rights reserved.