3

こんにちは、私はこれらのグループを適切にキャプチャする方法を見つけようとしてきましたが、できません: http://www.debuggex.com/r/xOmFR78EkK3mATN4/0

この例では、式の個々の部分をキャプチャする必要があり、現在は test1test1 == 0 test2 == 1test3 == 2test3 のみに一致しています。すべての式を適切に一致させる方法がわかりません。

私は C++ とブースト正規表現を使用しますが、それは何も変わらないはずです

4

2 に答える 2

1

これにはBoost.Xpressiveを使用できます。

#include <iostream>
#include <boost/xpressive/xpressive.hpp>

using namespace boost::xpressive;

int main()
{
    std::string str( "testrule: test1 == 0 && test2 == 1 && test3 == 2 ; test desc" );

    sregex_compiler comp;
    regex_constants::syntax_option_type x = regex_constants::ignore_white_space;
    comp.compile("(? $test = )(([\\w\\.]+)\\s+(==|!=|>|<)\\s+([\\w\\.]+))", x);
    sregex test = comp.compile("^(\\w+):\\s+(? $test )(\\s&&\\s(? $test ))*\\s*;\\s*(.*)$", x);

    smatch what;
    if(regex_match(str, what, test))
    {
        for(smatch const & nested : what.nested_results())
            std::cout << nested[0].str() << std::endl;
    }
}

このプログラムは以下を出力します。

test1 == 0
test2 == 1
test3 == 2

Boost.Regex がサポートしているとは思えない、ネストされた動的正規表現を戦略的に使用します。良いニュースは、Boost を使用している場合、上記の方法で問題なく動作することです。Xpressive はヘッダーのみのライブラリです。つまり、ビルドする必要はありません。

Xpressive のセマンティック アクションを使用すると、これをはるかに効率的に行うことができます。それほど難しくはありませんが、使い慣れた正規表現構文の多くを忘れてしまいます。

別のオプションは、 Boost.Spiritを使用して単純なパーサーを構築することです。これもヘッダーのみです。

チッ!

于 2013-07-16T23:54:38.277 に答える