5

C++ 正規表現文字列のキャプチャを機能させるように試みます。Windows と Linux、Boost とネイティブ C++ 0x11 の 4 つの組み合わせをすべて試しました。サンプルコードは次のとおりです。

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

using namespace std;
using namespace boost;

int main(int argc, char** argv)
{
    smatch sm1;
    regex_search(string("abhelloworld.jpg"), sm1, regex("(.*)jpg"));
    cout << sm1[1] << endl;
    smatch sm2;
    regex_search(string("hell.g"), sm2, regex("(.*)g"));
    cout << sm2[1] << endl;
}

動作する最も近いのは、Boost (1.51.0) を使用した g++ (4.7) です。そこでは、最初の cout が期待どおりに出力されますabhelloworld.が、2 番目の cout からは何も出力されません。

-std=gnu++11 を指定した g++ 4.7<regex>ではなく、<boost/regex.hpp>出力を生成しません。

ネイティブを使用する Visual Studio 2012<regex>は、互換性のない文字列反復子に関する例外を生成します。

Boost 1.51.0 を使用する Visual Studio 2008 では<boost/regex.hpp>、「標準 C++ ライブラリの無効な引数」に関する例外が発生します。

これらのバグは C++ 正規表現にあるのでしょうか、それとも何か間違ったことをしているのですか?

4

2 に答える 2

7

これらのバグは C++ 正規表現にあるのでしょうか、それとも何か間違ったことをしているのですか?

<regex>投稿の時点で、他の回答に記載されているように、gcc はサポートしていませんでした(現在はサポートしています)。他の問題に関しては、一時的な文字列オブジェクトを渡していることが問題です。コードを次のように変更します。

smatch sm1;
string s1("abhelloworld.jpg");
regex_search(s1, sm1, regex("(.*)jpg"));
cout << sm1[1] << endl;
smatch sm2;
string s2("hell.g");
regex_search(s2, sm2, regex("(.*)g"));
cout << sm2[1] << endl;

元の例regex_searchは、一時オブジェクトがバインドできる const 参照を取得するためコンパイルされますが、smatchイテレータは存在しない一時オブジェクトにのみ格納されます。解決策は、一時的なものを渡さないことです。

[§ 28.11.3/5] で C++ 標準を見ると、次のことがわかります。

戻り値: regex_search(s.begin(), s.end(), m, e, flags) の結果。

これが意味することは、内部的には、渡された文字列への反復子のみが使用されるため、一時オブジェクトを渡すと、その一時オブジェクトへの反復子が使用されますが、これは無効であり、実際の一時自体は格納されません

于 2012-08-25T21:12:34.407 に答える
0

GCC はまだサポートし<regex>ていません。マニュアル参照

于 2012-08-25T19:39:50.797 に答える