我正在尝试编写一个处理程序来从函数中提取参数,其中参数介于()之间,参数将由命令分隔,''参数也可以定义为以逗号分隔并包装在[]中的数组。
我尝试解码的例子:
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
答案 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个子匹配。第一个是单独的术语。第二个是以逗号分隔的术语链。第三个是,
之后的其余字符串。
尾部将是空的,或者是另一个可以使用上述正则表达式解析的字符串。
术语链可以用相同的正则表达式解析。
我匹配<>
分隔的术语链,而不是[]
,因为我对\\
s感到厌倦。
您还想丢弃子句周围的空格。我省略了它,它应该很容易拼接。
答案 1 :(得分:0)