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






4.43/5 (22投票s)
本文回答了在使用 C++ TR1 中的正则表达式时出现的一些初步问题。
引言
正则表达式语法在许多环境中都非常相似。然而,你使用正则表达式的方式却大相径庭。例如,一旦你编写了你的正则表达式,你如何使用它来查找匹配或替换文本?一旦你知道要查找哪个 API,就很容易找到详细的 API 文档。弄清楚从哪里开始往往是最困难的部分。
本文假设你熟悉正则表达式,并且希望使用 C++ 中的正则表达式,使用 C++ 标准库的 Technical Report 1 (TR1) 扩展。这是一个快速入门指南,简要回答你可能首先会问的一些问题。有关更多详细信息,请参阅 C++ TR1 正则表达式入门,或者深入研究你的实现附带的文档。
快速入门问题
问:在哪里可以获得 TR1?
答:Visual Studio 2008 中对 TR1 扩展的支持作为 功能包 添加。其他实现包括 Boost 和 Dinkumware。 GNU 编译器 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 日:添加示例