我需要验证一个至少5个字符长的字符串,包含至少一个大写字母,至少一个小写字母,至少一个数字,除了短划线和下划线之外没有其他字符。我用其他语言测试了它,它显然有用:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z_\-]{5,}$
但是,在C ++中,这个简单的测试程序将诸如“AasdA”之类的字符串验证为正确的输入。我知道我错过了一些明显的东西,但经过大量的研究我无法分辨出什么是错的。也许这与getline()存储字符串的方式有关。这是我的代码:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
string test;
do {
cout << "Test: ";
getline(cin, test);
if (regex_match(test, regex("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z_\-]{5,}$"))) {
cout << "True." << endl;
} else {
cout << "False." << endl;
}
} while (test != "");
return 0;
}
答案 0 :(得分:2)
你需要将字符串常量中的反斜杠加倍:
if (regex_match(test, regex("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z_\\-]{5,}$"))) {