【发布时间】:2012-07-24 09:35:44
【问题描述】:
我正在尝试使用正则表达式来尝试对 this question 做出回答,并发现虽然 regex_match 找到了匹配项,但 regex_search 却没有。
以下程序是用g++ 4.7.1编译的:
#include <regex>
#include <iostream>
int main()
{
const std::string s = "/home/toto/FILE_mysymbol_EVENT.DAT";
std::regex rgx(".*FILE_(.+)_EVENT\\.DAT.*");
std::smatch match;
if (std::regex_match(s.begin(), s.end(), rgx))
std::cout << "regex_match: match\n";
else
std::cout << "regex_match: no match\n";
if (std::regex_search(s.begin(), s.end(), match, rgx))
std::cout << "regex_search: match\n";
else
std::cout << "regex_search: no match\n";
}
输出:
正则表达式匹配:匹配 regex_search: 不匹配我的假设是两者都应该匹配错误,还是 GCC 4.7.1 中的库有问题?
【问题讨论】:
-
GCC 的正则表达式库在很大程度上仍未实现(GCC Y U SHIP BROKEN
<regex>?),所以我倾向于说,是的,这是库的问题。 -
您的程序与 VS2010 产生了两次匹配,所以我猜问题出在 gcc 使用的库上。您是否尝试过使用正则表达式库的 boost 版本?
-
@H2CO3 您也可以使用汇编,但您可能不想这样做 :) C++ 中包含的 C 函数也是如此。它们打破了 C++ 编程风格(例如,您需要开始检查返回码,而不是关心异常)。
-
@H2CO3 当然可以,但目前我正在尝试了解新的 C++11 标准及其所有功能。在现实世界的场景中,我可能会使用 Boost,或者系统中可用的任何东西(例如标准 POSIX 功能)。
-
@H2CO3 :) 如果我需要在实际代码中实现类似的东西,我肯定会使用 POSIX 正则表达式(或 Boost.Regex)。但是OP的问题是一个很好的问题。实际上我想知道为什么 GCC 决定发布一个损坏的正则表达式实现。完全没有支持总比坏了好...