如何使用带有lambda函数的boost regex_replace?

时间:2018-01-21 09:40:14

标签: c++ boost lambda

我正在尝试使用lambda函数调用boost::regex_replace类型的std::string。我没有运气得到所有类型的正确。

typedef boost::basic_regex<char> regex;
typedef boost::match_results<char> smatch;

    std::string text = "some {test} data";
    regex re( "\\{([^\\}]*)\\}" );
    text  = boost::regex_replace( text, re, [&](smatch const & what) {
        return what.str();
    });

我使用typedef而不是标准名称,因为我有一些地方使用typedef / templated字符类型而不是固定类型。

在此代码中,我收到此错误:/usr/include/boost/regex/v4/match_results.hpp:68:77: error: no type named 'difference_type' in 'struct boost::re_detail::regex_iterator_traits<char>' BidiIterator>::difference_type difference_type;

3 个答案:

答案 0 :(得分:2)

如记录on the match_results reference pageboost::match_results的第一个类型参数是BidirectionalIterator类型;因此,例如,标准typedef boost::smatchmatch_results<std::string::const_iterator>

要修复代码,您需要更正smatch typedef并删除lambda参数what上的引用或使其成为const引用:

typedef boost::basic_regex<char> regex;
typedef boost::match_results<std::string::const_iterator> smatch;

std::string text = "some {test} data";
regex re("\\{([^\\}]*)\\}");
text = boost::regex_replace(text, re, [] (const smatch& what) {
    return what.str();
});

答案 1 :(得分:1)

如果你有一个符合C ++ 11的编译器,你既不需要Boost也不需要lambda。

要实现相同的目标,您只需使用std::regex

#include <iostream>
#include <regex>

int main()
{
  std::string text = "some {test} data {asdf} more";
  std::regex re("\\{([^\\}]*)\\}");
  std::string out;
  std::string::const_iterator it = text.cbegin(), end = text.cend();
  for (std::smatch match; std::regex_search(it, end, match, re); it = match[0].second)
  {
    out += match.prefix();
    out += match.str(); // replace here
  }
  out.append(it, end);
  std::cout << out << std::endl;
}

当然,对于简单的文本替换,您可以使用std::regex_replace(),但它无法接受仿函数,只能接受静态格式字符串,可选择使用组占位符:

  std::string text = "some {test} data {asdf} more";
  std::regex re("\\{([^\\}]*)\\}");
  std::string out = std::regex_replace(text, re, "<$1>");

答案 2 :(得分:0)

smatch类型有问题。我找不到一个带有typename的工作示例,但使用C ++ 14 auto lambda参数解决了这个问题:

    auto text = "some {test} data";
    regex re( "\\{([^\\}]*)\\}" );
    text  = boost::regex_replace( text, re, [&](auto & what) {
        return what.str();
    });