检索嵌套在字符串中的每个括号的内容

时间:2018-02-19 18:21:42

标签: c++

我想知道一种方法来检索嵌套在一串字符中的每个括号的内容。

这是一个非常基本的例子:

([Last group]([Second group]([First group])))

更清楚地看到:

(c(b(a)))

从那里开始,我想把内容放在一个向量中,这里是模式:

[0]: a
[1]: b
[2]: c

我实现了几个代码,包括这个代码:

std::vector<std::string> GetEachParenthesisContent(std::string str) {
            //str = "(c(b(a)))";
            using namespace std;
            int level = 0;
            int Depth = MaxDepth(str);                  // Gets the number of parenthesis groups (in example --> 3)
            vector<string> ret;                         // will be returned
            string tmp;
            for (int i = 0; i < str.length(); ++i) {
                char curr = str[i];
                switch (curr){
                case '(':
                    if (level < Depth) {
                        ++level;
                        continue;
                    }
                    if (level >= Depth)
                        tmp += curr;
                    break;
                case ')':
                    if (level < Depth) {
                        ++level;
                        continue;
                    }
                    if (level >= Depth) {
                        tmp += curr;
                        ret.push_back(tmp);
                        tmp.clear();
                    }
                    break;
                default:
                    tmp += curr;
                    break;
                }
            }
            return ret;
        }

结果:

cba)
)
)

此代码不起作用,但不是因为缺少在互联网上搜索! 我不认为我离开了#34;坏&#34;但是,即使我的代码不起作用,我认为达到结果的原则必须相似,但显然更好。

我也尝试过使用正则表达式的方法,但我意识到这是不可能的。

因此,我请求你的帮助。

PS:如果我误解了论坛,标题,内容,我提前道歉......我在发布之前阅读了规则:)

2 个答案:

答案 0 :(得分:0)

这不是一个完整的解决方案,而是一个如何解决问题的想法。我使用<div class="row" fxFlex="basis"> <div class="col-xs-12 col-sm-12 p-small-text"> {{app._description}} </div> </div> <div class="row" style="border: 1px solid black;" fxFlex="grow"> <div class="col-xs-12 col-sm-12">no content</div> </div> <div class="row p-row-top-padding" fxFlex="basis"> <div class="col-xs-12 col-sm-12">dynamic content</div> </div> 在括号打开时上升一个级别,在关闭时下降一个级别。随意进一步修改:

std::stack

https://ideone.com/ok4M3U

#include <iostream>
#include <string>
#include <stack>

int main() 
{
    std::stack<std::string> st;
    std::string s = "(a(b(c)))";

    for (char const c : s)
    {
        if (c == '(')
        {
            st.push(std::string(&c, 1));
            continue;
        }

        st.top() += c;  

        if (c == ')')
        {
            std::cout << st.top() << std::endl;
            st.pop();
        }
    }
}

答案 1 :(得分:0)

您可以使用正则表达式轻松完成此操作。

std::string str = "(c(b(a)))";
std::smatch match;
std::regex exp(R"(\w+)");

std::stack<std::string> s;

while (std::regex_search(str, match, exp))
{
    s.push(match.str());
    str = match.suffix();
}

while (!s.empty())
{
    std::cout << s.top() << std::endl;
    s.pop();
}

输出:

a
b
c