2

我正在尝试使用正则表达式来验证字符串,所以在我继续之前让我先解释一下字符串的样子:可选的位数后跟一个“X”和一个可选的(“^”后跟一个或更多数字)。

以下是一些示例:“2X”、“X”、“23X^6”适合该模式,而“X^”、“4”、“foobar”、“4X^”、“4X44”等字符串则不适合。

现在我在哪里:使用 'egrep' 和 "^[0-9]{0,}\X(\^[0-9]{1,})$" 正则表达式我可以很好地验证这些字符串但是在尝试时this 在 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

您的正则表达式未能将'^'后面的一位或多位数字设为可选;将其更改为:
"^[0-9]*X(\\^[0-9]+)?$"

另请注意,此页面表示 GCC 的支持<regex>只是部分的,因此std::regex可能对您根本不起作用(在这种情况下,“部分”显然意味着“损坏”);您是否尝试过Boost.XpressiveBoost.Regex作为健全性检查?

于 2012-05-14T19:41:59.780 回答
2

可选的位数,后跟一个“X”和一个可选的(“^”后跟一个或多个数字)。

好的,您代码中的正则表达式与该描述不匹配,原因有两个: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 回答