1

私はここに 1 日近く座っていて、なぜ C++11 正規表現ライブラリが出力を返すのかわかりません。パターンを見つけることではなく、さまざまな正規表現テスターで既に設計およびテストしています。(正規表現など)

処理したい文字列の例は次のとおりです。

if12b031, if12b141, ic12a042

これらは、最大 8 文字の文字と数字を含むユーザー名で、各ユーザー名はコンマで区切られています。文字列はユーザ​​ーが入力するもので、コンマで終わってはいけません。コンマ間のスペースはオプションです。

このパターンは、この問題を解決するための私のアプローチでした:

^[A-z0-9]{1,8}(\s*,\s*[A-z0-9]{1,8})*$

ここで、ユーザーは少なくとも 1 つのユーザー名を入力する必要がありますが、カンマで区切られ、最大長が 8 文字である限り、必要なだけ入力できます。

奇妙なことに、上記の正規表現テスターでテストすると、このパターンは機能します。しかし、それは私のコードではありません。

パターン テストのみを目的とした小さなサンプル プログラムを作成しました。

#include <regex>
#include <string>
#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
string tmp;
string pattern = "^[A-z0-9]{1,8}(\\s*,\\s*[A-z0-9]{1,8})*$";

while(true)
{
    getline(cin, tmp);

    cout << "input: " << tmp << endl;
    cout << "pattern: " << pattern << endl;

    try {
        if(regex_match(tmp, regex(pattern, std::regex_constants::basic))) {
            cout << "match" << endl;
        }
        else
        {
            cout << "no match" << endl;
        }
    } catch (std::regex_error& e) {
        cout << e.code() << endl;
    }
}
return 0;
}

次のコードを使用してコンパイルしました。

c++ -std=c++11 -o test test.cpp

奇妙なことに、機能するような単純なパターンすら取得できません[A-z]{1,8}。単一の文字を入力すると一致するだけですが、数字を入力すると一致するのですが、理由がわかりません。

入力の長さが1を超えるとすぐに、常に「一致なし」と出力されます。そして、入力の長さが1である限り、regex_matchはパターンを気にしないようです。

何故ですか?正直なところ、ここでどこを間違えているのかわかりません。$ や % などの一部の特殊文字にも一致しますが、§ には一致しません。

regex_constants正規表現オブジェクトのコンストラクターでいくつか試した場合。

  • extendedたとえば、括弧を追加するとすぐにエラー コード 5 が表示されます。それらがなくても、2 文字以上の入力には一致しません。

  • basicエラーはスローされませんが、それでも同じ奇妙な動作です。

  • ECMAScript括弧を意味するエラーコード 4 が表示されます。

正直なところ、これがうまくいかない理由がわかりません。

仮想マシン(VMWare)でUbuntu 13.10 64ビットGnomeを実行していますが、デュアルブートシステムとしてインストールされているラップトップでも試しました。gcc のバージョンは 4.8.1 です。

これは私の最初の質問なので、皆さんが私を助けてくれるのに十分な詳細を提供できれば幸いです. 前もって感謝します。

4

1 に答える 1

5

gcc の正規表現の実装はコンパイルできるかもしれませんが、それだけです。gcc 4.8 では主に実装されていません(項目 28 を参照)。

于 2013-10-19T23:34:54.667 に答える