2016-12-27 5 views
2

I型の文字列から左&右部分を抽出するために、次のコードを持っているC++ 11正規表現はサブマッチ

[3-> 1]、[2-> 2]、[5-> 3]

私のコードは次のようになります以下の

#include <iostream> 
#include <regex> 
#include <string> 

using namespace std; 

int main() 
{ 
    regex expr("([[:d:]]+)->([[:d:]]+)"); 
    string input = "[3->1],[2->2],[5->3]"; 

    const std::sregex_token_iterator end; 
    int submatches[] = { 1, 2 }; 
    string left, right; 

    for (std::sregex_token_iterator itr(input.begin(), input.end(), expr, submatches); itr != end;) 
    { 
     left = ((*itr).str()); ++itr; 
     right = ((*itr).str()); ++itr; 

     cout << left << "  " << right << endl; 
    } 
} 

出力のように見えます

3  1 
2  2 
5  3 

今、私は最初の部分が数字の代わりに文字列になるように拡張しようとしています。例えば、入力は

[(3)、(5)、(0,1)→2]、[(32,2)→6]、[(27)、(61) 、11) - > 1]

そして私は、私は

(3),(5),(0,1)->2],[(32,2)->6],[(27),(61,11)  1 
を以下のよう ("(\\(.*+)->([[:d:]]+)")は、ちょうど2つの文字列全体を分割しようとした

(3),(5),(0,1) 2 
(32,2)   6 
(27),(61,11)  1 

基本的な表現としてそれを分割する必要があります誰かが私にこれを達成するためのいくつかの提案を与えることができますか?すべての助けを感謝します。

+2

正規表現を削除し、適切なパーサーを作成します。 –

答えて

2

のように、複数のコメント/ * ... * /の正規表現を実行している場合のように、最初の '['、 ' - >'を除いてすべてを取得する必要があります。正規表現は貪欲になり、最後のものまですべてを食べます。あなたのケースでは " - >"のように起こります。それは非常に貪欲になるので、あなたは本当に任意の文字のためにドットを使用することはできません。

これは私の作品:除き、それはので、すべての文字、なります[...]の開始時に '^'

\\[([^-\\]]+)->([0-9]+)\\] 

'、および ' - - '、あなたは避けることができます ">" ]」、あなたが必要なもの

+0

これは迅速かつ有益でした。ヒントをいただきありがとうございます.. – wrongElk

2

を受け入れているが、それはもう少し具体的にすることです:

\[([^]]*)->([^]]*)\] 

あまりにも多くのデータを取り込む避けるために。 live demoを参照してください。

[^]]*の代わりに.*?パターンを使用できましたが、効率が低くなっていました。