c++ - 使用 boost::regex 获取子匹配结果

标签 c++ regex boost 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-itterator,因此该函数不会在上一场比赛结束的地方开始下一场比赛。

您可以使用迭代器形式:
(编辑 - 您还可以使用 token 迭代器,定义要迭代的组。在下面的代码中添加)。

#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
测试2
test3
测试0

关于c++ - 使用 boost::regex 获取子匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5781609/

相关文章:

c++ - 在条件变量上调用 notify 时互斥量是否被解锁?

c++ - dynamic_cast 抛出的 std::bad_cast 异常

javascript - 使用 javascript 将多行、缩进的 json 转换为单行

regex - 将get-content cmdlet与-replace选项一起使用以替换csv中的事件,无法弄清楚如何

c++ - Boost Log 剪切长日志消息

c++ - CMake的package_find冲突如何解决?

c++ - 我可以在 C++ 中使用 memcpy 来复制没有指针或虚函数的类吗

c++ - 如何使用 Windows API 检索 HD 供应商/序列号

java - 多次匹配后视/前视

c++ - ROS Linking errors using boost::filesystem library 在linux下使用C++