Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::regex获取子匹配结果_C++_Regex_Boost_Boost Regex - Fatal编程技术网

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

C++ 使用boost::regex获取子匹配结果,c++,regex,boost,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"; const bool ret=boost:

嘿,假设我有一个正则表达式:
(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";
const bool ret=boost::regex_搜索(输入,what,r);
对于(size_t i=0;icout在我看来,您需要使用
(test[0-9])
regex作为输入来创建一个。然后,您可以使用生成的
regex_迭代器
枚举原始目标的匹配子字符串


如果您仍然需要“一个整体匹配”,那么这项工作可能必须与查找匹配子字符串的任务分离。您能否澄清这部分需求?

Boost.Regex为这一特性提供了实验性支持(称为重复捕获);但是,由于它对性能的巨大影响,默认情况下会禁用此功能

要启用重复捕获,您需要重建Boost.Regex并在所有转换单元中定义宏
Boost\u Regex\u MATCH\u EXTRA
;最好的方法是在boost/regex/user.hpp中取消注释这个define(请参阅,它位于页面的最底部)

使用此定义编译后,您可以通过调用/使用带有
match\u extra
标志的
regex\u search
regex\u match
regex\u迭代器
来使用此功能


查看参考以了解更多信息。

我认为Dot Net能够创建单个捕获组集合,以便(grp)+在group1上创建一个集合对象。boost引擎的regex_search()将与任何普通匹配函数一样。您坐在一个while()循环中,与上次匹配结束的模式相匹配。您使用的表单不使用出价提交器,因此该函数不会在上次匹配结束时开始下一次匹配

您可以使用提交人表单:
编辑-您还可以使用令牌迭代器,定义要迭代的组。添加在下面的代码中)

#包括
#包括
#包括
使用名称空间std;
使用名称空间boost;
int main()
{ 
string input=“test1、test2、test3、test0、,”;
boost::regexr(“(test[0-9])(?:$|[,]+)”;
刺激:smatch什么;
std::string::const_迭代器start=input.begin();
std::string::const_迭代器end=input.end();
while(boost::regex_搜索(开始、结束、什么、r))
{
字符串stest(what[1]。第一,what[1]。第二);
库特
#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;
}