c posix regex验证输入HH:MM:SS时间字符串

时间:2012-02-24 09:47:00

标签: c regex validation time posix

Regex pattern for HH:MM:SS time string相关 我正在尝试验证用户时间输入。

int main(int argc, char *argv[]){
        regex_t regex;
        int reti;
        char msgbuf[100];
        char inputStr2[100]="12:34:04";
        char inputStr[100]="12:34";

/* Compile regular expression */
        reti = regcomp(&regex, "^((([01]?[0-9]|2[0-3]):)?([0-5]?[0-9]):)?([0-5]?[0-9])$", 0);
        if( reti ){
        fprintf(stderr, "Could not compile regex\n");
        }

/* Execute regular expression */
           printf("%s is the string\n",inputStr);
        reti = regexec(&regex, inputStr, 0, NULL, 0);
        if( !reti ){
                puts("Match");
        }
        else if( reti == REG_NOMATCH ){
                puts("No match");
        }
        else{
                regerror(reti, &regex, msgbuf, sizeof(msgbuf));
                fprintf(stderr, "Regex match failed: %s\n", msgbuf);
        }
         printf("%s is the string\n",inputStr2);
        reti = regexec(&regex, inputStr2, 0, NULL, 0);
        if( !reti ){
                puts("Match");
        }
        else if( reti == REG_NOMATCH ){
                puts("No match");
        }
        else{
                regerror(reti, &regex, msgbuf, sizeof(msgbuf));
                fprintf(stderr, "Regex match failed: %s\n", msgbuf);
        }
/* Free compiled regular expression if you want to use the regex_t again */
    regfree(&regex);

        return 0;
}
  1. 我得到错误未知转义序列'\ d'。
  2. 这是错的吗?这是验证用户时间输入的最佳方法吗? 编辑: 尝试"^(?:(?:([01]?\\d|2[0-3]):)?([0-5]?\\d):)?([0-5]?\\d)$",我得到一个不匹配。 还有

4 个答案:

答案 0 :(得分:3)

您可以尝试strptime(),例如

struct tm t;
char p;

p = strptime(inputStr, "%H:%M:%S", &t);

if (p == NULL || *p != '\0') {
    abort();
}

答案 1 :(得分:1)

POSIX正则表达式引擎不支持非捕获组(?:...)。改为使用普通组:

^((([01]?[0-9]|2[0-3]):)?([0-5]?[0-9]):)?([0-5]?[0-9])$

我没有安装gcc。如果底层正则表达式引擎是POSIX BRE而不是POSIX ERE(我认为),则需要不同的语法(因为括号被视为文字,除非转义,并且POSIX BRE不知道?量词:

^\(\(\([01]\{0,1\}[0-9]|2[0-3]\):\)\{0,1\}\([0-5]\{0,1\}[0-9]\):\)\{0,1\}\([0-5]\{0,1\}[0-9]\)$

或作为字符串:

"^\\(\\(\\([01]\\{0,1\\}[0-9]|2[0-3]\\):\\)\\{0,1\\}\\([0-5]\\{0,1\\}[0-9]\\):\\)\\{0,1\\}\\([0-5]\\{0,1\\}[0-9]\\)$"

答案 2 :(得分:0)

因为当您编写\然后字母编译器认为它是一个特殊字符,如\n(新行符号)或\t(制表符号)。并且没有\d符号,这就是您收到错误的原因。如果你的意思是“一个数字”,你应该写\\d。实际上你只需要转义反斜杠(\是C,C ++,Java,C#和许多其他语言中的转义字符。)
例如,这个搅拌"abc\n\\d"实际上是"abc[enter]\d"在记忆中。所以当你在模式中对\\d进行实际操作时,它会以\d的形式保存在内存中,实际上就是你所需要的。

答案 3 :(得分:0)

在C中,\是字符串中的转义字符,您必须将其加倍才能获得正则表达式中的转义字符,即\\

试试这个:

"^(?:(?:([01]?\\d|2[0-3]):)?([0-5]?\\d):)?([0-5]?\\d)$"