2

文字列を検証するために正規表現を使用しようとしているので、先に進む前に、まず文字列がどのように見えるかを説明させてください: オプションの桁数の後に「X」とオプションの (「^」の後に 1 つまたはより多くの桁)。

"2X"、"X"、"23X^6" はパターンに適合しますが、"X^"、"4"、"foobar"、"4X^"、"4X44" などの文字列は適合しません。

今どこにいましたか:「egrep」と「^[0-9]{0,}\X(\^[0-9]{1,})$」正規表現を使用すると、これらの文字列をうまく検証できますが、試してみるとこれは C++ で C++11 正規表現ライブラリを使用すると失敗します。

これらの文字列を検証するために使用しているコードは次のとおりです。

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

int main()
{
    std::regex r("^[0-9]{0,}\\X(\\^[0-9]{1,})$",
                 std::regex_constants::egrep);
    std::vector<std::string> challanges_ok {"2X", "X", "23X^66", "23X^6",
                                            "3123X", "2313131X^213213123"};
    std::vector<std::string> challanges_bad {"X^", "4", "asdsad", " X",
                                             "4X44", "4X^"};
    std::cout << "challanges_ok: ";
    for (auto &str : challanges_ok) {
        std::cout << std::regex_match(str, r) << " ";
    }

    std::cout << "\nchallanges_bad: ";
    for (auto &str : challanges_bad) {
        std::cout << std::regex_match(str, r) << " ";
    }
    std::cout << "\n";

    return 0;
}

私は何か間違ったことをしていますか、それとも何かが欠けていますか? GCC 4.7 でコンパイルしています。

4

2 に答える 2

4

あなたの正規表現は、その後に'^'続く1つ以上の数字をオプションにすることができません。に変更します
"^[0-9]*X(\\^[0-9]+)?$"

また、このページでは、GCC のサポート<regex>は部分的なものにすぎないためstd::regex、まったく機能しない可能性があることにも注意してください (このコンテキストでの「部分的」とは明らかに「壊れた」ことを意味します)。健全性チェックとしてBoost.XpressiveまたはBoost.Regexを試しましたか?

于 2012-05-14T19:41:59.780 に答える
2

オプションの桁数の後に「X」とオプション(「^」の後に1つ以上の桁)が続きます。

OK、コードの正規表現はその説明と一致しません。2つの理由があります。Xに余分な円記号があることと、「^digits」の部分がオプションではないことです。必要な正規表現は次のとおりです。

^[0-9]{0,}X(\^[0-9]{1,}){0,1}$

つまり、grepコマンドは次のようになります(重引用符に注意してください)。

egrep '^[0-9]{0,}X(\^[0-9]{1,}){0,1}$'  filename

そして、C++コードで渡さなければならない文字列は次のとおりです。

"^[0-9]{0,}X(\\^[0-9]{1,}){0,1}$"

次に、すべての明示的な数量詞を従来の略語に置き換えると、@ ildjarnの答えが得られます:{0,}is *{1,}is +{0,1}is ?

于 2012-05-14T19:48:52.333 に答える