2016-04-11 11 views
3

すべての正規表現とそれらの位置を取得する必要があります。すべての正規表現の一致を一つずつ取得する

例えば、私はこの正規表現を持っている:

std::regex r("(a)|(b)|(c)"); 

そして、この入力テキスト:

std::string text("abcab"); 

は今、私はループに私は1つのマッチからのすべての出現にアクセスすることができ、すべてのループであっ試合をしたいです。最初のループでは、私は位置0に "a"を、位置3に "a"を得ることができました。2番目のループでは、1で "b"、4で "b"になります。3番目のループでは "c "2位にある。これをどうすればできるの?

現在、正規表現の部分は別に(正規表現(a)(b)(c))、1つずつ順番に並べています。しかし、それらのかなりのものがありますので、私はより良い/より速い解決策を探しています。

+0

http://en.cppreference.com/w/cpp/regex/regex_iterator –

+0

[this](https://ideone.com/QAqBGn)のようなもの? –

+0

@WiktorStribiżewどのマッチ番号が現在のマッチであるか知る必要があります。 –

答えて

2

キャプチャされた値を格納するために文字列ベクトルを宣言し、次に一致した代替分岐を確認し、対応するベクトルに追加することができます。ここで

C++ demoです:

#include <string> 
#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 
    std::regex r("(a)|(b)|(c)"); 
    std::string s = "abcab"; 
    std::vector<std::string> astrings; // Declare the vectors to 
    std::vector<std::string> bstrings; // populate with the contents 
    std::vector<std::string> cstrings; // of capturing groups 

    for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); 
      i != std::sregex_iterator(); 
      ++i) 
    { 
     std::smatch m = *i; 
     if (m[1].matched) {     // Check if Group 1 matched and 
      astrings.push_back(m[1].str()); // Put a value into a string vector 
     } 
     else if (m[2].matched) {   // Check if Group 2 matched and 
      bstrings.push_back(m[2].str()); // Put a value into b string vector 
     } 
     else if (m[3].matched) {    // Check if Group 3 matched and 
      cstrings.push_back(m[3].str()); // Put a value into c string vector 
     } 
    } 

    // Printing vectors - DEMO 
    for (auto i: astrings) 
     std::cout << i << ' '; 
    std::cout << "\n"; 
    for (auto i: bstrings) 
     std::cout << i << ' '; 
    std::cout << "\n"; 
    for (auto i: cstrings) 
     std::cout << i << ' '; 

    return 0; 
} 

あなたはまた、正規表現を宣言するときstd::regex_constants::optimizeフラグを使用して検討すること(Galik's commentを参照してください)。

+1

を使って最適化することを忘れないでください。これは動作しますが、それでも私は必要以上に遅いです。私は60以上の正規表現を持っており、入力テキストは何千もの行になる可能性があるので、他の方法でそれを解決しなければならない。しかし、まだ、ありがとう! :) –

+0

さて、おそらく、正規表現は、あなたの仕事のための最良のツールではありません。あるいは、私が疑うかぎり、問題は1つまたは2つのパターンのどこかで、パフォーマンスの問題を引き起こす可能性があります(これは正規表現の共通の問題です)。 –

関連する問題