2

我将在 C++ 应用程序中使用正则表达式,但我对正则表达式没有经验。我特别想检查一些字符串是否属于以下类别之一:

X.anystring -> X 必须是唯一且唯一的字母(不是数字)。

XY.anystring -> X, Y 必须是数字 0-9(不是字母)。

如何使用正则表达式检查它们?为了让我熟悉正则表达式,您可以推荐什么正则表达式教程?

4

6 回答 6

3

说真的,在这种情况下, regexp:s 不是适合您的解决方案。

首先,regexp:s 不是 C++ 语言的一部分,因此您需要使用特定的 regexp 库。(C++11,不管是谁,都包括对 regexp:s 的支持。)

其次,您的两个用例都可以简单地用纯 C++ 编码,您需要做的就是遍历字符串中的字符并检查它们是否符合您的要求。

于 2012-06-25T07:55:57.133 回答
1
#include <regex>

std::string str = "OnlyLetter,12345";

std::string x = "([a-z]|[A-Z])+";
std::string y = "[0-9]+";
std::string expression = std::string(x).append(",").append(y);
std::tr1::regex rx(expression);
bool match = std::tr1::regex_match(str.c_str(),rx);
// match = true. Valid String
// match = false. Invalid String. ex.: "OnlyLetter,12s345"
于 2013-07-12T14:12:37.270 回答
1

当前的 C++11 标准支持正则表达式,但我不确定哪些编译器支持它并准备好使用。

同时,Boost 库为 C++ 提供了一个很好的正则表达式系统(链接在这里)。

在学习正则表达式方面,可能会有所帮助(专注于使用 Boost 正则表达式)。

对于您的情况可能更简单的替代解决方案就是自己编写代码。就像是:

bool check_first(const string& myString)
{
    if (!isalpha(myString[0]) || myString[1] != '.') return false;
    return true;
}

bool check_second(const string& myString)
{
    if (!isdigit(myString[0]) || !isdigit(myString[1]) || myString[2] != '.') return false;
    return true;
}
于 2012-06-25T07:48:11.540 回答
1

X.anystring -> X 必须是唯一且唯一的字母(不是数字)。

所需的正则表达式是

[a-zA-Z]\.[\w]+

XY.anystring -> X, Y 必须是数字 0-9(不是字母)。

所需的正则表达式是

[0-9]{2}\.[\w]+

在此处了解有关正则表达式的更多信息。一旦您大致了解了正则表达式,您就可以应用到您选择的任何语言。

于 2012-06-25T07:48:32.007 回答
1

如果您只想知道一个字符串是否匹配一个或另一个,但您不在乎它匹配哪个,您可以使用:

"(?:(?:[a-zA-Z])|(?:[0-9]{2}))\..*"

使用 C++11regexECMAScript语法。

于 2012-06-25T08:49:28.320 回答
0

这取决于您使用的正则表达式库。但以下内容应该适用于 Boost 和 C++11:

对于 X.anystring(X 是 alpha):

"[[:alpha:]]\\..*"

对于 XY.anystring:

"[[:digit:]][[:digit:]]\\..*"

这些用于regex_match; 如果你想使用regex_search,你必须将表达式“锚定”到字符串的开头,方法是在它前面加上一个 '^'(但你可以去掉最后的 '.*')。

于 2012-06-25T08:15:53.580 回答