2017-03-23 14 views
1

私は正規表現を使ってパスワードの強さをチェックするためにCプログラムにコードを書いています。
私の要件は次のとおりです。 「少なくとも1つの上部の文字と一つ下の文字一桁と1つの特殊文字や全体的なパスワードの長さが最小9つの文字でなければなりません」Cプログラムでregexを使ってパスワードの強さを確認する

まず私はhttp://regexr.com/で正規表現の組み合わせを考え出したし、正規表現の組み合わせが((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_+-.,[email protected]#$%^&*();\/|<>"']).{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])(?=.*[_+-.,[email protected]#$%^&*();\/|<>"']).{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:]]のように? ご存知の方は、ここでヒントを教えてください。

+3

「少なくとも1つの上の文字と1つの下の文字1桁と1つの特殊文字」これは強力なパスワードを作成する方法ではありません。それがあなたが忘れられないパスワードを作る方法です。これをしないでください。 – Alexander

+2

正規表現はパスワードの解析には適していないと思います。それ以外の場合は、さまざまな文字クラスを任意の順序で使用できるようにする必要があります。これは最高のフィドルです。 –

+0

パターン内の各 '\'(バックスラッシュ)を倍にしてみてください。私は正規表現がこれを行う方法ではないことに同意しますが、単に文字列をスキャンして各要件を数えることができます。 –

答えて

2

あなたのプログラムはコンパイルされませんでした。コメントの1つとして、バックスラッシュ文字\は、Cで特殊文字に使用されているため、それぞれのバックスラッシュ文字をエスケープする必要があります。

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; 
} 
:単なる文字列をスキャンし、カウント、小切手のこの種のための正規表現を使用することはお勧めできません。また

int rc = regcomp(&comp_ex, "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_+-.,[email protected]#$%^&*();\\/|<>\"']).{9,})", 0); 

\\\を交換し、そして\""を置き換え、これは正規表現をエスケープしてみてください

+0

ありがとうございました.. – Madhu

関連する問題