正则表达式匹配每种类型的一个或多个字符?

时间:2013-05-09 15:15:49

标签: c++ regex boost

有三种类型的字符:A-Za-z0-9

如何编写正则表达式来匹配所有三种类型中包含一个或多个字符的单词?

例如:

匹配:abAcc88, Ua8za8, 88aA

不匹配:abc, 118, aa7, xxZZ, XYZ111

boost::regex re("^[A-Za-z0-9]+$");不起作用。

由于

4 个答案:

答案 0 :(得分:3)

至少IMO,试图用一个正则表达式来做这一切是一个糟糕的主意。虽然它可以使它工作,但你最终会得到一个难以理解的混乱。目的并不明显。

IMO,你可以更好地直接表达逻辑(尽管在这个过程中使用正则表达式或两个正则不会受到伤害):

boost::regex lower("[a-z]");
boost::regex upper("[A-Z]");
boost::regex digit("[0-9]");

if (find(string, lower) && find(string,upper) && find(string,digit))
    // it passes
else
    // it fails

对于那些即使是最少接触RE的人来说,只需要一瞥就可以弄清楚这是做什么的(即使没有暴露于RE,也可能没有真正的巨大才能弄明白{ {1}}表示“从a-za”的字符。)

答案 1 :(得分:2)

假设您正在分别测试每个单词:

boost::regex re("(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])");

不需要锚点。


实际上,如果boost不支持外观:

boost::regex re(".*[a-z].*([A-Z].*[0-9]|[0-9].*[A-Z])|.*[A-Z].*([a-z].*[0-9]|[0-9].*[a-z])|.*[0-9].*([a-z].*[A-Z]|[A-Z].*[a-z])");

正如@Bill指出的那样,这就是每一个组合。

答案 2 :(得分:1)

(\w*[a-z]\w*[A-Z]\w*[0-9]\w*)|(\w*[a-z]\w*[0-9]\w*[A-Z]\w*)|(\w*[A-Z]\w*[a-z]\w*[0-9]\w*)|(\w*[A-Z]\w*[0-9]\w*[a-z]\w*)|(\w*[0-9]\w*[A-Z]\w*[a-z]\w*)|(\w*[0-9]\w*[a-z]\w*[A-Z]\w*)

l = lower U = upper N = number

1. `(\w*[a-z]\w*[A-Z]\w*[0-9]\w*)` Match words __l__U___N___  
2. `(\w*[a-z]\w*[0-9]\w*[A-Z]\w*)` Match words __l__N___U___  
3. `(\w*[A-Z]\w*[a-z]\w*[0-9]\w*)` Match words __U__l___N___  
4. `(\w*[0-9]\w*[A-Z]\w*[a-z]\w*)` Match words __U__N___l___  
5. `(\w*[0-9]\w*[A-Z]\w*[a-z]\w*)` Match words __N__U___l___  
6. `(\w*[0-9]\w*[a-z]\w*[A-Z]\w*)` Match words __N__l___U___ 

答案 3 :(得分:0)

好吧,如果我们要去非正规路线,那么为什么不把它一路带走呢? - )

const char* c = "abAcc88";
char b = 0b000;
for (; *c; c++) b |= 48 <= *c && *c <= 57  ? 0b001 :
                    (65 <= *c && *c <= 90  ? 0b010 :
                    (97 <= *c && *c <= 122 ? 0b100 :
                                             0b000 ));
if (b == 0b111)
{
    std::cout << "pass" << std::endl;
}

(它不可读,等等;我开玩笑。)