regex_match和regex_search之间的区别?

时间:2012-07-24 09:35:44

标签: c++ regex gcc g++

我正在尝试使用正则表达式尝试回答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_match: match
regex_search: no match

我的假设是两者都应该匹配错误,或者GCC 4.7.1中的库可能存在问题吗?

3 个答案:

答案 0 :(得分:7)

你的正则表达式正常工作(两者都匹配,这是正确的)在VS 2012rc中。

在g ++ 4.7.1 (-std=gnu++11)中,如果使用:

  • ".*FILE_(.+)_EVENT\\.DAT.*"regex_match匹配,但regex_search没有。
  • ".*?FILE_(.+?)_EVENT\\.DAT.*"regex_matchregex_search都不匹配(O_o)。

所有变体都应匹配,但有些变量不匹配(原因已由betabandido指出)。在g ++ 4.6.3 (-std=gnu++0x)中,行为与g ++ 4.7.1相同。

Boost(1.50)正确匹配所有内容 w /两种模式变种。

<强>摘要

                        regex_match      regex_search
 -----------------------------------------------------
 g++ 4.6.3 linux            OK/-               -
 g++ 4.7.1 linux            OK/-               -
 vs 2010                     OK                OK
 vs 2012rc                   OK                OK
 boost 1.50 win              OK                OK
 boost 1.50 linux            OK                OK
 -----------------------------------------------------

关于你的模式,如果你意味着一个点字符'.',那么你应该这样写("\\.")。您还可以使用非贪婪修饰符(?)来减少回溯:

".*?FILE_(.+?)_EVENT\\.DAT.*"

答案 1 :(得分:3)

查看regex_search的最新libstdc ++ source code,您会发现:

* @todo Implement this function.

不幸的是,这不是唯一留下的TODO项目。 GCC的<regex>实施目前尚未完成。我建议使用Boost或Clang以及#ifdef代码,直到GCC赶上来。

(这在4.8分支中都没有修复。)

答案 2 :(得分:2)

我试图在C ++ 11中使用正则表达式库,我遇到了很多问题(使用g ++ 4.6和4.7)。基本上,支持要么不存在,要么只有部分支持。即使对于SVN版本也是如此。这里有一个描述current status for the SVN version of libstdc++的链接。

因此,目前我认为最好的选择是继续使用Boost.Regex

或者,您可以尝试使用libc++。根据{{​​3}},对正则表达式的支持已经完成。