我在C程序中编写代码以使用正则表达式检查密码的强度 我的要求是: “至少一个上部字符和一个下部字符一个数字和一个特殊字符,总密码长度应至少为9个字符”
首先,我在http://regexr.com/中找出正则表达式组合,正则表达式组合为((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_+-.,!@#$%^&*();\/|<>"']).{9,})
但是,如果我使用下面的程序在C语言中尝试相同的方法,它就不起作用了:
#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
#include<sys/types.h>
#include<regex.h>
static void check_password_strength(const char *password) {
regex_t comp_ex;
int rc = regcomp(&comp_ex, "((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_+-.,!@#$%^&*();\/|<>"']).{9,})", 0);
if (rc != 0) {
char errbuf[1024];
(void)(regerror(rc, &comp_ex, errbuf, sizeof(errbuf)));
printf("%s: error compiling regex: %s", __FUNCTION__, errbuf);
return;
}
if (regexec(&comp_ex, password, 0, NULL, 0) == 0) {
regfree(&comp_ex);
printf("Password accepted :%s\n", password);
return;
}
printf("password NOT accepted\n");
regfree(&comp_ex);
return;
}
void main(int argc, char *argv[])
{
int i = 0;
if (argc != 2) {
printf("invalid number of args \n");
return;
}
check_password_strength(argv[1]);
}
我是否需要在C程序中以不同的方式使用正则表达式?与[[:alnum:]]
或[[:digit:]]
一样?
如果你知道的话,请你在这里暗示一下吗?
答案 0 :(得分:2)
你的程序甚至没有编译。正如其中一条评论所说,你应该逃避每个反斜杠字符\
,因为它被C用于特殊字符。将\
替换为\\
,并将"
替换为\"
,尝试使用此转义的正则表达式:
int rc = regcomp(&comp_ex, "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_+-.,!@#$%^&*();\\/|<>\"']).{9,})", 0);
使用正则表达式进行此类检查也不是一个好主意,只需扫描字符串并计算:
static bool check_password_strength(const char *password) {
const char *p = password;
char c;
int nupper = 0;
int nlower = 0;
int ndigit = 0;
int nspecial = 0;
while (*p) {
c = *p++;
if (isupper(c)) ++nupper;
else if (islower(c)) ++nlower;
else if (isdigit(c)) ++ndigit;
else if (ispunct(c)) ++nspecial;
else continue; // space character
}
return nupper && nlower && ndigit && nspecial;
}