2016-08-03 9 views
0

関数からパラメータを抽出するハンドラを記述しようとしていますが、パラメータが()の間にあり、パラメータが '、'によって区切られます。コンマで区切られ、[]でラップされた配列です。私は解読しようとしているものの文字列を配列に分割する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 
+1

何か試しましたか? – DimChtz

+1

これらのネストが許可されていれば、正規表現はこれ以上カットしません。これは適切なパーサーを必要とします。ブーストを与えなさい。 –

+0

@DimChtz、私はパーサーを書くために一日中努力してきました。私の正規表現の知識はあまり良くなく、通常はリフレッシャーコースに頼らざるを得ません。 – SPlatten

答えて

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

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

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

re_strあなたの文字列をとり、そして尾から第一項またはチェーンをオフに分割します。

3つまでのサブマッチを返します。最初は孤独な言葉です。 2つ目はコンマで区切られた一連の用語です。 3番目は,の後の文字列の残りの部分です。

テールは空になるか、上記の正規表現を使用して解析できる別の文字列になります。

連鎖は同じ正規表現で解析できます。

live example

私は\\の退屈していたので、[]ではなく、区切られた用語のチェーンに一致しました。

また、句節の空白を破棄したい場合もあります。私はそれを省いた、それは簡単にステッチする必要があります。

0

私は動作するはずです。この正規表現を持って

これはQt5.6のためにC++で書かれた作品私のコード化されたソリューションです。

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

See here at Regexr

+0

ありがとう、近いがかなり。 – SPlatten

関連する問題