gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:02:49 25 4
gpt4 key购买 nike

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

我正在尝试解码的示例:

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

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

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

对于测试A:

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

对于测试B:

    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

最佳答案

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 .

我匹配了<>分隔的术语链,而不是 [] ,因为我厌倦了\\

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

关于C++正则表达式将字符串拆分为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38746537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com