Related to Regex pattern for HH:MM:SS time string I am trying to validate user time input.
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;
}
- i get the error unknown escape sequence '\d'.
whats wrong here? Is this the best way to go about validating user time input?.
Edit:
Tried with "^(?:(?:([01]?\\d|2[0-3]):)?([0-5]?\\d):)?([0-5]?\\d)$"
and i get a no match.
Also with
Because when you write
\
and then a letter compiler thinks it's a special character like\n
(new line symbol) or\t
(tab symbol). And there is no\d
symbol that's why you're getting an error. You should write\\d
if you mean "a digit". Actually you just need to escape the backslash (\
is the escape character in C, C++, Java, C# and many other languages).For example this stirng
"abc\n\\d"
actually is"abc[enter]\d"
in memory. So when you right\\d
in pattern in fact it's kept in memory as\d
, actually what you need.In C,
\
is an escape character in a string, you have to double it to get the escape character in a regex ie\\
.Try this:
You could try
strptime()
, for exampleA POSIX regular expression engine does not support non-capturing groups
(?:...)
. Use normal groups instead:I don't have gcc installed. If the underlying regex engine is a POSIX BRE instead of a POSIX ERE (as I thought), then a different syntax is needed (because parentheses are treated as literals unless escaped, and POSIX BREs don't know the
?
quantifier:or, as a string: