2016-11-02 8 views
1

文字列を多項式クラスに変換するための関数を実装するために使用する、多項式の項を一致させるための正規表現があります。正確な一致が生成された正規表現デモhereを見ることができます。しかし、私がそれを実装しようとすると、私のプログラムはマッチを適切に見つけますが、スクリーンに奇妙にそれらをプリントします。この場合、私のC++の正規表現は正しくマッチしていますが、正しい値を返さないのはなぜですか?

-21323x^5+1233x4+123x^2-1232 
Trying to match: -21323x^5+1233x4+123x^2-1232 
-21323x^5 
Trying to match: +1233x4+123x^2-1232 
1233x4 
Trying to match: +123x^2-1232 
12xx^2 
Trying to match: -1232 
-1232 

12xx^2なく123x^2

と他の印刷何らかの理由:例えば

-1234x^5+789x4+6x^2-567+123x 
Trying to match: -1234x^5+789x4+6x^2-567+123x 
-1234x^5 
Trying to match: +789x4+6x^2-567+123x 
789x4 
Trying to match: +6x^2-567+123x 
x^22 
Trying to match: -567+123x 
-567 
Trying to match: +123x 
23xx 

この場合、x^22代わりに6x^223xxの代わりを示します123x

これは私のコードです:

Poly* Poly::fromString(std::string str) { 
    Poly* re = new Poly; 
    bool returnNull = true; 
    std::regex r_term("((-?[0-9]*)x(\\^?([0-9]+))?|-?[0-9]+)"); 
    std::smatch sm; 
    while(std::regex_search(str, sm, r_term)) { 
     returnNull = false; 
     std::cout << "Trying to match: " << str << std::endl; 
     str = sm.suffix().str(); 
     std::cout << sm.str() << std::endl; 
    } 

    if(returnNull) { 
     delete re; 
     return nullptr; 
    } else return re; 
} 
+1

'sm.str()'を出力する行の下に 'str = sm.suffix()。str();'という行を移動します。 'smatch'はマッチのコピーを保持せず、イテレータのみを元の文字列に入れます。その下から文字列を変更すると、プログラムはそれらのイテレーターを無効にし、したがって定義されていない動作を示します。 –

+0

意味があります。どうもありがとうございました。これを回答として追加してください。 –

答えて

0

イゴールが正しくあなたの現在のコードの問題に気づいている間、私はあなたが必要とするすべては、完全なパターンの一致を得ることであると思うし、この目的のために、私はむしろ使用をお勧めしたいです正規表現イテレータ:

std::regex r("(-?[0-9]*)x(\\^?([0-9]+))?|-?[0-9]+"); 
std::string s = "-21323x^5+1233x4+123x^2-1232"; 
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); 
         i != std::sregex_iterator(); 
         ++i) 
{ 
    std::smatch m = *i; 
    std::cout << "Match value: " << m.str() << '\n'; 
    std::cout << "Group 1 value: " << m.str(1) << '\n'; 
    std::cout << "Group 2 value: " << m.str(2) << '\n'; 
    std::cout << "Group 3 value: " << m.str(3) << '\n'; 
} 

C++ demo onlineを参照してください。

パターンの詳細:

  • -?から1又は0ハイフン
  • [0-9]*から0以上の数字
  • x - リテラル文字x
  • (\\^?([0-9]+))? - の1又は0の配列:
    • \\^? - optio NAL(1又は0)^シンボル
    • [0-9]+から1桁以上
  • |
  • - 又は
  • -? - 任意ハイフン/マイナス
  • [0-9]+から1桁以上。
+0

私は実際に私の係数とパワーに即座にアクセスすることができるので、実際にサブミッチを使用することに興味があります。 –

+0

これを残しておいてください。ただし、アライメント全体がすでにグループ0に入っているので、外側の括弧を削除することをお勧めします。また、イテレータを使用すると、コード実行中に破棄される初期文字列のコピーを作成する必要はありません。 –

+0

私は同意します。それは良いアイデアのようです。私が外のマッチグループを持っていた理由は、私が間違ってあなたがあなたに|正規表現演算子。 –

関連する問題