3

我正在尝试让 boost::regex 为我提供搜索字符串中所有出现的模式。认为这样的事情会很简单,但让它来提升和 STL 在一切之上添加 10 个模板混淆的元层 :)。

我最近的尝试是使用 regex_search(),但不幸的是我的调用似乎与任何重载都不匹配。这是一个超级蒸馏的例子:

std::string test = "1234567890";
boost::regex testPattern( "\\d" );
boost::match_results<std::string::const_iterator> testMatches;
std::string::const_iterator startPos = test.begin();
while( regex_search( startPos, test.end(), testMatches, testPattern ) ) {
    // Do stuff: record match value, increment start position
}

我对 regex_search() 的调用触发了智能感知,并且无法编译(“没有 'regex_search' 的实例与参数列表匹配”)。

我试图调用的重载是:

template <class BidirectionalIterator,
    class Allocator, class charT, class traits>
bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
    match_results<BidirectionalIterator, Allocator>& m,
    const basic_regex<charT, traits>& e,
    match_flag_type flags = match_default );

这似乎与我的调用相匹配。

任何想法表示赞赏!以及做这类事情的替代方法。我最终想要做的是拆分一个字符串,如:

"0.11,0.22;0.33,0.444;0.555,0.666"

进入我可以解析的浮动字符串的组成列表。

在任何其他正则表达式包中,这很简单——通过类似“(?:([0-9.]+)[;,]?)+”的表达式运行它,捕获的组将包含结果。

4

2 回答 2

4

问题实际上是您正在混合迭代器类型 (std::string::iteratorstd::string::const_iterator,并且由于regex_search是模板函数,因此不允许从iteratorto进行隐式转换。const_iterator

你是正确的,声明test为 aconst std::string将修复它,因为test.end()现在将返回 a const_iterator,而不是iterator.

或者,您可以这样做:

std::string test = "1234567890";
boost::regex testPattern( "\\d" );
boost::match_results<std::string::const_iterator> testMatches;
std::string::const_iterator startPos = test.begin();
std::string::const_iterator endPos = test.end();
while( regex_search( startPos, endPos, testMatches, testPattern ) ) {
    // Do stuff: record match value, increment start position
}

如果你有 C++11 可用,你也可以使用新std::string::cend成员:

std::string test = "1234567890";
boost::regex testPattern( "\\d" );
boost::match_results<std::string::const_iterator> testMatches;
std::string::const_iterator startPos = test.begin();
while( regex_search( startPos, test.cend(), testMatches, testPattern ) ) {
    // Do stuff: record match value, increment start position
}
于 2013-03-25T20:16:35.233 回答
0

好的,想通了这一点。如果搜索到的字符串声明为“const”,则正确找到该方法。例如:

const std::string test = "1234567890";
于 2013-03-25T03:10:40.117 回答