C ++正则表达式将字符串拆分为数组

时间:2016-08-03 14:31:58

标签: c++ regex

我正在尝试编写一个处理程序来从函数中提取参数,其中参数介于()之间,参数将由命令分隔,''参数也可以定义为以逗号分隔并包装在[]中的数组。

我尝试解码的例子:

    testA(aaaa, [bbbb,cccc,dddd], eeee)

    testB([aaaa,bbbb,cccc], dddd, [eeee,ffff])

基本上任何组合和任意数量的参数,我想要的是一个包含以下内容的列表:

for testA:

    0 : aaaa
    1 : [bbbb,cccc,dddd]
    2 : eeee

for testB:

    0 : [aaaa,bbbb,cccc]
    1 : dddd
    2 : [eeee,ffff]

我试图编写一个能给我相同的解析器,但是这样做的正则表达式将是首选。

这是我的编码解决方案,它使用C ++编写的Qt5.6:

    int intOpSB, intPStart;
    //Analyse and count the parameters
    intOpSB = intPStart = 0;
    for( int p=0; p<strParameters.length(); p++ ) {
        const QChar qc = strParameters.at(p);

        if ( qc == clsXMLnode::mcucOpenSquareBracket ) {
            intOpSB++;
            continue;
        } else if ( qc == clsXMLnode::mcucCloseSquareBracket ) {
            intOpSB--;
            continue;
        }
        if ( (intOpSB == 0 && qc == clsXMLnode::mcucArrayDelimiter)
        || p == strParameters.length() - 1 ) {
            if ( strParameters.at(intPStart) == clsXMLnode::mcucArrayDelimiter ) {
    //Skip over the opening bracket or array delimiter
                intPStart++;
            }
            if ( intPStart > p ) {
                continue;
            }
            int intEnd = p;
            while( true ) {
                if ( intEnd > 0 && (strParameters.at(intEnd) == clsXMLnode::mcucArrayDelimiter) ) {
    //We don't want the delimiter or the closing square bracket in the parameter
                    intEnd--;
                } else {
                    break;
                }
            }
            if ( intEnd > intPStart ) {
                QString strParameter = strParameters.mid(intPStart, intEnd - intPStart + 1);
    //Update remaining parameters, skipping the parameter and any delimiter
                strParameters = strParameters.mid(strParameter.length() + 1);
    //Remove any quotes
                strParameter = strParameter.replace("\"", "");
                strParameter = strParameter.replace("\'", "");
    //Add the parameter
                mslstParameters.append(strParameter);
    //Reset parameter start
                intPStart = 0;
                p = -1;
            }
        }
    }

参考文献:

    mcucOpenSquareBracket is a constant defined as '['
    mcucCloseSquareBracket is a constant defined as ']'
    mcucArrayDelimiter is a constant defined as ','
    mslstParameters is a member defined as QStringList

2 个答案:

答案 0 :(得分:2)

auto term = "(?:[^,<]*)"s;
auto chain = "(?:(?:"+term+",)*"+term+")"s;

auto clause = "(?:(?:"+term+")|(?:<" + chain + ">))"s;

auto re_str = "^(?:("+term+")|(?:<("+chain+")>))" "(?:|,((?:"+clause+",)*"+clause+"))";

re_str接受你的字符串,并从尾部分割第一个术语或链。

最多返回3个子匹配。第一个是单独的术语。第二个是以逗号分隔的术语链。第三个是,之后的其余字符串。

尾部将是空的,或者是另一个可以使用上述正则表达式解析的字符串。

术语链可以用相同的正则表达式解析。

live example

我匹配<>分隔的术语链,而不是[],因为我对\\ s感到厌倦。

您还想丢弃子句周围的空格。我省略了它,它应该很容易拼接。

答案 1 :(得分:0)

我有这个正则表达式应该可行。

\[.*?\]|([^,\s]+)

See here at Regexr