与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(®ex, "^((([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(®ex, inputStr, 0, NULL, 0);
if( !reti ){
puts("Match");
}
else if( reti == REG_NOMATCH ){
puts("No match");
}
else{
regerror(reti, ®ex, msgbuf, sizeof(msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
}
printf("%s is the string\n",inputStr2);
reti = regexec(®ex, inputStr2, 0, NULL, 0);
if( !reti ){
puts("Match");
}
else if( reti == REG_NOMATCH ){
puts("No match");
}
else{
regerror(reti, ®ex, 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(®ex);
return 0;
}
"^(?:(?:([01]?\\d|2[0-3]):)?([0-5]?\\d):)?([0-5]?\\d)$"
,我得到一个不匹配。
还有
答案 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)$"