4

ねえ、私がこの正規表現を持っているとしましょう:(test[0-9])+

そして、私はそれを以下と照合します:test1test2test3test0

const bool ret = boost::regex_search(input, what, r);

for (size_t i = 0; i < what.size(); ++i)
    cout << i << ':' << string(what[i]) << "\n";

今、(最後の出現)what[1]になります。test0, 2 と 3 も取得する必要があるとしましょうtest1: どうすればよいでしょうか?

注: 実際の正規表現は非常に複雑で、1 つの全体的な一致を維持する必要があるため、正規表現の例を に変更しても機能し(test[0-9])ません。

4

3 に答える 3

10

(grp)+ が group1 にコレクション オブジェクトを作成するように、Dot Net には単一のキャプチャ グループ コレクションを作成する機能があると思います。ブースト エンジンの regex_search() は、通常の一致関数と同じようになります。最後の一致が中断されたパターンに一致する while() ループに座っています。使用したフォームはビッドイテレーターを使用していないため、関数は最後の一致が中断された場所から次の一致を開始しません。

イテレータ形式を使用できます:
(編集- トークン イテレータを使用して、反復するグループを定義することもできます。以下のコードに追加されています)。

#include <boost/regex.hpp> 
#include <string> 
#include <iostream> 

using namespace std;
using namespace boost;

int main() 
{ 
    string input = "test1 ,, test2,, test3,, test0,,";
    boost::regex r("(test[0-9])(?:$|[ ,]+)");
    boost::smatch what;

    std::string::const_iterator start = input.begin();
    std::string::const_iterator end   = input.end();

    while (boost::regex_search(start, end, what, r))
    {
        string stest(what[1].first, what[1].second);
        cout << stest << endl;
        // Update the beginning of the range to the character
        // following the whole match
        start = what[0].second;
    }

    // Alternate method using token iterator 
    const int subs[] = {1};  // we just want to see group 1
    boost::sregex_token_iterator i(input.begin(), input.end(), r, subs);
    boost::sregex_token_iterator j;
    while(i != j)
    {
       cout << *i++ << endl;
    }

    return 0;
}

出力:

test1
test2
test3
test0

于 2011-04-25T20:03:52.717 に答える
6

Boost.Regex は、まさにこの機能 (反復キャプチャと呼ばれる) の実験的サポートを提供します。ただし、パフォーマンスが大幅に低下するため、この機能はデフォルトで無効になっています。

繰り返しキャプチャを有効にするには、Boost.Regex を再構築BOOST_REGEX_MATCH_EXTRAし、すべての翻訳単位でマクロを定義する必要があります。これを行う最善の方法は、boost/regex/user.hpp でこの定義のコメントを解除することです (リファレンスを参照してください。ページの一番下にあります)。

この定義を使用してコンパイルするとregex_search、フラグを使用して呼び出し/使用することで、この機能を使用できます。regex_matchregex_iteratormatch_extra

詳細については、 Boost.Regexへの参照を確認してください。

于 2011-04-25T19:29:49.940 に答える
3

正規表現を入力として使用して、 regex_iteratorを作成する必要があるように思え(test[0-9])ます。次に、結果を使用してregex_iterator、元のターゲットの一致する部分文字列を列挙できます。

それでも「1 つの全体的な一致」が必要な場合は、おそらくその作業を、一致する部分文字列を見つけるタスクから分離する必要があります。要件のその部分を明確にできますか?

于 2011-04-25T19:23:03.477 に答える