2012-06-25 34 views
2

我将在C++应用程序中使用正则表达式,但是我没有在正则表达式中体验过。我特别要检查一些字符串,如果它们属于以下类别之一:在C++中使用正则表达式检查字符串

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

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

如何使用正则表达式来检查它们?你可以推荐哪些正则表达式教程,以使我了解正则表达式?

+0

你检查了cppreference.com吗? – nhahtdh

+0

看看[Boost Regex](http://www.boost.org/doc/libs/1_49_0/libs/regex/doc/html/index.html)。 – cdhowie

+0

有趣的是,这个问题的两个答案如何完成彼此。一个是关于正则表达式,另一个是关于C++库。 –

回答

1

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

与此同时,Boost库为C++提供了一个很好的正则表达式系统(link here)。

在学习正则表达式方面,this可能有帮助(着重于使用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; 
} 
+0

由于C++ _is_ C++ 11的当前标准,前两个语句正式相互矛盾。 (当然,在实践中,你是否可以真正使用它是一个不同的问题,但是标准的正则表达式是基于boost的,所以你可以使用它们。) –

+0

足够公平,编辑。 – adelbertc

1

X.anystring - > X必须是必要和专门的信(未 位)。

必需的正则表达式是

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

XY.anystring - > X,Y必须是必然和独家数字0-9 (非字母)。

必需的正则表达式是

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

了解更多关于正则表达式here。一旦你了解了一般的正则表达式,你可以应用任何你选择的语言。

+0

我不认为这些是正确的。首先,第一个不匹配所有字母字符。那么'\ b'的目的是什么?和'[]'中的'\ w'? (我不认为'\ w'实际上是在'[]'中定义的;它通常被定义为'[^ _ [:alnum:]]',这在'[]'中是不合法的。) –

+0

I由于OP特别提到了'letter',所以我们忽略了alpha字符。 '\ w'虽然不是POSIX标准,但它确实被允许在[]内部。和'\ b'我同意在这种情况下是多余的。我编辑出了'\ b' –

+0

你能指出''w'在'[]'里面以及在哪个版本的正则表达式中有这么多。 C++ 11似乎并不清楚:它或者是被禁止的(未定义的行为,因为没有被指定),或者(我的阅读,尽管我完全不知道这是用意),相当于'[[_ [ alnum:]]],后面跟一个'+',它会匹配一个'[',一个'_'或一个alnum,后跟一个或多个']。 (鉴于OP说“任何字符串”,而不是一个符号,无论如何,'。*'都是想要的。) –

3

严重的是,在这种情况下,regexp:s不适合您。

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

其次,你的两个用例都可以用普通的C++编码,你需要做的就是遍历字符串中的字符并检查如果他们每个都符合你的要求。

+0

说实话,他甚至不需要循环;他从不需要看三个以上的字符。但是让他开始使用正则表达式可能是一个很好的练习,在处理文本输入时,如果正则表达式是最简单的解决方案,那么很快就会结束。 –

0

这取决于您正在使用的正则表达式库。但 以下应与升压和C++ 11工作:

对于X.anystring(X是阿尔法):

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

对于XY。anystring:

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

这些用于regex_match;如果要使用regex_search, ,则必须将表达式“锚定”到字符串的起始位置 前加上'^'(但可以删除最后的'。*')。

1

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

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

使用C++ 11 regexECMAScript语法。

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" 
相关问题