C++中利用std::regex确定密码验证未匹配的正则捕获组
C++密码验证:满足多维度规则并定位未达标项
刚好做过类似的密码验证需求,我来给你梳理清楚怎么实现完整的规则校验,同时精准定位哪些要求没满足。
首先先补全你提到的正则表达式,完整的正则需要覆盖所有要求的规则:
const std::regex passwordRegex(R"(^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@[-`{-~])(.{8,20})$)");
正则各部分解释
^和$:锚定字符串的开头和结尾,确保整个密码都符合规则,避免部分匹配的情况(?=.*[a-z]):正向预查,确保密码中至少包含一个小写字母(a-z)(?=.*[A-Z]):正向预查,确保至少包含一个大写字母(A-Z)(?=.*[0-9]):正向预查,确保至少包含一个数字(0-9)(?=.*[!-/:-@[-{-~])`:这部分对应你要求的特殊字符ASCII范围:- 33-47:
!到/ - 58-64:
:到@ - 91-96:
[到` - 123-126:
{到~
- 33-47:
(.{8,20}):确保密码长度在8到20个字符之间
如何定位未满足的具体要求
这里要注意:单个正则的正向预查是零宽度断言,不会生成能直接标记“哪条规则失败”的捕获组。所以更直观可靠的方式是逐个检查每个规则,这样能清晰返回未达标的具体项。
下面是完整的代码实现,包含验证函数和错误排查函数:
#include <iostream> #include <regex> #include <vector> #include <string> // 验证密码是否符合所有规则 bool isPasswordValid(const std::string& password) { const std::regex passwordRegex(R"(^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@[-`{-~])(.{8,20})$)"); return std::regex_match(password, passwordRegex); } // 获取密码未满足的具体规则列表 std::vector<std::string> getPasswordErrors(const std::string& password) { std::vector<std::string> errors; // 检查长度规则 if (password.size() < 8) { errors.emplace_back("密码长度不足8个字符"); } else if (password.size() > 20) { errors.emplace_back("密码长度超过20个字符"); } // 检查小写字母 const std::regex lowercaseCheck(R"(.*[a-z].*)"); if (!std::regex_match(password, lowercaseCheck)) { errors.emplace_back("缺少至少一个小写字母(a-z)"); } // 检查大写字母 const std::regex uppercaseCheck(R"(.*[A-Z].*)"); if (!std::regex_match(password, uppercaseCheck)) { errors.emplace_back("缺少至少一个大写字母(A-Z)"); } // 检查数字 const std::regex digitCheck(R"(.*[0-9].*)"); if (!std::regex_match(password, digitCheck)) { errors.emplace_back("缺少至少一个数字(0-9)"); } // 检查特殊字符 const std::regex specialCharCheck(R"(.*[!-/:-@[-`{-~].*)"); if (!std::regex_match(password, specialCharCheck)) { errors.emplace_back("缺少至少一个特殊字符(!、@、#、$等指定范围内的字符)"); } return errors; } // 使用示例 int main() { std::string testPassword = "HelloWorld123"; // 缺少特殊字符 if (isPasswordValid(testPassword)) { std::cout << "密码验证通过!\n"; } else { std::cout << "密码未通过验证,具体原因:\n"; for (const auto& err : getPasswordErrors(testPassword)) { std::cout << "- " << err << "\n"; } } return 0; }
代码说明
isPasswordValid函数快速判断密码是否符合所有规则getPasswordErrors函数会逐个检查每个规则,返回所有未满足的要求,方便给用户明确的提示- 使用示例中,测试密码
HelloWorld123会返回缺少至少一个特殊字符的错误
如果你一定要尝试用单个正则结合捕获组来判断,也可以给每个正向预查加捕获标记,但这种方法逻辑更绕,而且容易出现误判(因为正向预查不消耗字符),所以还是推荐逐个检查的方式,代码可读性和维护性都更好。
内容的提问来源于stack exchange,提问作者Dawid
相关产品推荐
相关产品推荐

