正则表达式程序中递归函数的返回值不一致

时间:2015-07-01 18:15:23

标签: c++ regex c++11 recursion

我使用这个递归函数在HTML中查找标签,输出现在还可以,但我对这个函数find_tag的返回值更感兴趣是:

 -somelargenumber
  html
  head
  body

其中-somelargenumber是函数的返回值,每次运行编译的程序时它都不同。

但根据我制作的函数,它必须在某个时间点返回0而不是任何其他值。有人可以解释一下吗?

#include<string>
#include<regex>
#include<iostream>
#include<iomanip>
using namespace std;
int find_tag(const string& s,vector<string> & cont )
{
    smatch m;
    if(s.size()>0)
    {
        if(regex_search(s,m,regex("<(.*)>(.*)</\\1>")))
        {
            cont.push_back(m[1]);
            find_tag(m[2],cont);
            find_tag(m.suffix(),cont);
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 0;
    }
}
int main()
{
    cmatch m;
    vector<string> cont;
    string data {"<html><head>head data</head><body>body data</body></html>"};
    cout<<find_tag(data,cont);
    if(!(cont.empty()))
    {
        for(auto &a:cont)
        {
            cout<<a<<endl;
        }
    }
    else
    {
        cout<<"\n not found";
    }
    return 0;
}

PS:我不想在这里解析任何HTML。我只对函数的返回值感兴趣。

2 个答案:

答案 0 :(得分:1)

The answer by @hades2510可以解决您的问题。

改善建议。

  1. 将函数名称更改为find_tags,因为您希望以递归方式找到许多标记。

  2. 您不需要返回类型为int。它看起来并不实用。如果您有任何标签,它们将通过输出参数返回。

  3. 如果你这样做,该功能可以简化为:

    void find_tags(const string& s,vector<string> & cont )
    {
       smatch m;
       if(regex_search(s,m,regex("<(.*)>(.*)</\\1>")))
       {
          cont.push_back(m[1]);
          find_tags(m[2],cont);
          find_tags(m.suffix(),cont);
       }
    }
    

答案 1 :(得分:0)

你需要:

return find_tag(m.suffix(),cont);

因为即使递归完成也不会这样做,所以你没有抓住它。

您看到的大量数字是编译器在递归完成后在堆栈中找到的内容。这取决于编译器,但很可能是find_tag的地址和data的某些地址的组合。