関数からパラメータを抽出するハンドラを記述しようとしていますが、パラメータが()の間にあり、パラメータが '、'によって区切られます。コンマで区切られ、[]でラップされた配列です。私は解読しようとしているものの文字列を配列に分割するC++の正規表現
例:
testA(aaaa, [bbbb,cccc,dddd], eeee)
または
testB([aaaa,bbbb,cccc], dddd, [eeee,ffff])
基本的に任意の組み合わせ及び任意の数のパラメータ、私はこれらの中から欲しいの入ったリストのようになります。
for testA:
0 : aaaa
1 : [bbbb,cccc,dddd]
2 : eeee
TESTBため
:
0 : [aaaa,bbbb,cccc]
1 : dddd
2 : [eeee,ffff]
私は私に同じを与えるパーサを書くしようとしているが、これを行うには正規表現が好ましいであろう。
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
何か試しましたか? – DimChtz
これらのネストが許可されていれば、正規表現はこれ以上カットしません。これは適切なパーサーを必要とします。ブーストを与えなさい。 –
@DimChtz、私はパーサーを書くために一日中努力してきました。私の正規表現の知識はあまり良くなく、通常はリフレッシャーコースに頼らざるを得ません。 – SPlatten