【问题标题】:problems with tr1/regex. Prints opposite resulttr1/正则表达式的问题。打印相反的结果
【发布时间】:2012-04-09 18:45:50
【问题描述】:

知道为什么下面的代码会打印“no match”吗?与编译器或库版本有关的东西?我用 g++ a.cpp 编译。

#include <tr1/regex>
#include <iostream>
#include <string>

using namespace std;

int main()
{
   const std::tr1::regex pattern("(\\w+day)");

   std::string weekend = "Saturday and Sunday";

   std::tr1::smatch result;

   bool match = std::tr1::regex_search(weekend, result, pattern);

   if(match)
   {
      for(size_t i = 1; i < result.size(); ++i)
      {
         std::cout << result[i] << std::endl;
      }
   }else
    std::cout << "no match" << std::endl;

   return 0;
}

【问题讨论】:

  • +1 表示简短的完整测试用例。
  • 代码是如此明显,以至于我怀疑编译器(至少在我的版本中)对标准的支持不完全。我该如何验证?
  • 仅供参考 - MSVC 2010 SP1 (16.00.40219.01) 编译并正确找到匹配项。您没有指定您使用的 GCC 版本。
  • 在 g++ 4.6.1 和 g++ 4.3.4 中,此语句断言:assert( std::tr1::regex_search("a", std::tr1::regex("a")) );

标签: c++ regex tr1


【解决方案1】:

你的编译器肯定有问题。我建议(因为您使用的是 Linux,这使得它特别容易)简单地将 &lt;tr1/regex&gt; 换成 &lt;boost/regex.hpp&gt;。命名空间也变为 boost:: 而不是 std::tr1:: 但所有其他语法完全相同,它可能会解决您的所有问题。

如果你不能使用 boost,那就另当别论了;但在过去一年左右的时间里,大多数人/雇主/公司都对提升更友好。

还要注意您的测试用例存在缺陷。你有一个循环,但它只会打印一个值。 regex_search 一次返回一个值,您需要使用新的搜索开始索引继续调用它以获取所有结果。如果您说程序的输出什么都没有(与“不匹配”相比),那么我会说错误在您的代码中。但是当前编写的代码应该返回"Saturday"""

【讨论】:

    【解决方案2】:

    您是否尝试过转义 ()。在某些正则表达式实现中,您必须使用\( 进行分组。无论如何,您可能不需要它。

    最基本的正则表达式是:

    "[a-zA-Z]+day"
    

    你会得到result[0]的结果

    【讨论】:

    • 仍然“不匹配”。看起来是一个编译器问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2011-09-22
    • 2010-10-25
    相关资源
    最近更新 更多