在C程序中使用正则表达式来检查密码强度

时间:2017-03-23 00:26:00

标签: c regex posix

我在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:]]一样? 如果你知道的话,请你在这里暗示一下吗?

1 个答案:

答案 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;
}