1

正規表現に問題があり、助けが必要です。mein .txt ファイルに次のような式がいくつかあります。

19 = NAND (1, 19) 

正規表現 : http://rubular.com/r/U8rO09bvTO

この正規表現を使用すると、数字の個別の一致が得られました。しかし今、ブラケット内の数字の量が不明な正規表現が必要です。

例えば:

19 = NAND (1, 23, 13, 24)

マッチ 1: 19、マッチ 2: 1、マッチ 3: 23、マッチ 4: 13、マッチ 5: 24

枚数はわかりません。したがって、不明な番号まで、ブラケット内の最小 2 の番号の主な式が必要です。

ちなみに私はc++を使っています。@ Martjin あなたの最初の正規表現はとてもうまくいきました。ここに私のコード:

    boost::cmatch result;
    boost::regex matchNand ("([0-9]*) = NAND\\((.*?)\\)");
    boost::regex matchNumb ("(\\d+)");
    string cstring = "19 = NAND (1, 23, 13, 24)";
    boost::regex_search(cstring.c_str(), result, matchNand);
    cout << "NAND: " << result[1] << "=" << result[2] << endl;
    string str = result[2];
    boost::regex_search(str.c_str(), result, matchNumb);
    cout << "NUM: " << result[1] << "," << result[2]<< "," << result[3] << "," << result[4] << endl;

私の出力: NAND: 19=1, 23, 13, 24 NUM: 1,,,

だから私の新しい問題は、最初の数字しか見つからないことです。結果は、このソリューションとは正反対です: http://rubular.com/r/nqXDSuBXjc

4

1 に答える 1

1

単純な(そしておそらく1つの正規表現よりも明確な)のは、これを2つの正規表現に分割することです。

まず、引数から結果を分割する正規表現を実行します:http: //rubular.com/r/YkGdkkg4y3

([0-9]*) = NAND \((.*?)\)

次に、引数のすべての数値に一致する正規表現を実行します:http: //rubular.com/r/2vpSbZvz12

\d+

scanRubyを使用していると仮定すると、ここで説明されている関数と複数回一致する正規表現を実行できます:http: //ruby-doc.org/core-1.9.3/String.html#method-i-scan

もちろん、scan関数で2番目の正規表現を使用して、その行からすべての数値を取得することもできますが、このアプローチがもう少し構造化されるときに、さらに拡張することになると思います。

于 2012-12-15T01:40:35.477 に答える