使用boost::regex获取sub-match_results
Getting sub-match_results with boost::regex
嘿,假设我有一个正则表达式:(test[0-9])+
和test1test2test3test0
const bool ret = boost::regex_search(input, what, r);
for (size_t i = 0; i < what.size(); ++i)
cout << i << ':' << string(what[i]) << "n";
现在,what[1]
将是test0
(最后一次出现)。假设我需要得到test1
, 2和3:我该怎么做?
注意:真正的正则表达式非常复杂,必须保持一个整体匹配,所以将示例正则表达式更改为(test[0-9])
是行不通的。
我认为Dot Net有能力使单个捕获组集合,以便(grp)+将在group1上创建一个集合对象。boost引擎的regex_search()将与任何普通的匹配函数一样。您坐在while()循环中,匹配上次匹配结束的模式。您使用的表单不使用bid- iterator,因此该函数不会在上次匹配停止的地方开始下一个匹配。
可以使用迭代器的形式:
(编辑 -你也可以使用标记迭代器,定义要迭代的组。添加在下面的代码中)。
#include <boost/regex.hpp>
#include <string>
#include <iostream>
using namespace std;
using namespace boost;
int main()
{
string input = "test1 ,, test2,, test3,, test0,,";
boost::regex r("(test[0-9])(?:$|[ ,]+)");
boost::smatch what;
std::string::const_iterator start = input.begin();
std::string::const_iterator end = input.end();
while (boost::regex_search(start, end, what, r))
{
string stest(what[1].first, what[1].second);
cout << stest << endl;
// Update the beginning of the range to the character
// following the whole match
start = what[0].second;
}
// Alternate method using token iterator
const int subs[] = {1}; // we just want to see group 1
boost::sregex_token_iterator i(input.begin(), input.end(), r, subs);
boost::sregex_token_iterator j;
while(i != j)
{
cout << *i++ << endl;
}
return 0;
}
输出: test1
test2
test3
test0
Regex为这个特性提供了实验性的支持(称为重复捕获);但是,由于它对性能的影响很大,因此默认情况下禁用此功能。
要启用重复捕获,需要重新构建Boost。Regex和定义宏BOOST_REGEX_MATCH_EXTRA
在所有翻译单元;最好的方法是取消boost/regex/user.hpp中的这个定义的注释(请参阅参考资料,它位于页面的最底部)。
一旦用这个定义编译,你可以通过调用/using regex_search
, regex_match
和regex_iterator
使用match_extra
标志来使用这个特性。
检查Boost的引用。
在我看来,你需要创建一个regex_iterator,使用(test[0-9])
正则表达式作为输入。然后可以使用结果regex_iterator
枚举原始目标的匹配子字符串。
如果你仍然需要"一个整体匹配",那么也许这项工作必须从寻找匹配子字符串的任务中解耦。你能说明一下你的那部分要求吗?
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 模板函数参数到模板函数的"candidate template ignored: could not match ..."
- 开放CV垫"Sizes of input arguments do not match"的问题
- ZeroMQ 发布-订阅通信:SUB 不接收任何内容
- 如何'Invalid conversion'和'no match for operator'更正这些 c++ 错误
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- nng to pynng pub/sub. 客户端未收到任何消息
- 如何为 Festvox 安装 g++ 编译的 "sub" 库?
- glUniform4fv results in GL_INVALID_OPERATION
- ZeroMQ SUB 从不接收消息
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- 为什么我收到以下错误:"no match for 'operator=='"?(带模板的嵌套类)
- 将cpp_redis pub/sub与条件变量一起使用时出现问题
- 如何修复类函数"prototype does not match"和"cadidate is"错误
- 这是当前草案中[Expr.Ref]/(4.2)和[Expr.sub]/1之间的矛盾
- 我应该在C++中手动写出"sub-results"吗?
- 在命名空间内的类中使用带有运算符重载的字符串流时"no match for ‘operator>>’"
- protobuf "oneof" sub-protobuf 对象指针终止程序
- MSVC:带函数的"error C2244: unable to match function definition to an existing declaration"是指专用模板类的类型别名