我需要验证日期的用户输入格式为MM / YYYY。
我决定使用regcomp和regexec函数作为我的解决方案。
问题是:无论输入输出是始终匹配。并且对regexec的调用的返回值为0 ,表示即使确实没有匹配也匹配。
为什么会这样?
我知道我使用的正则表达式将匹配99/99,但我首先想弄清楚为什么它也匹配ABCDE。
以下是有问题的代码:
#include <iostream>
#include <cstring>
#include <regex.h>
using namespace std;
int main(int argc, char ** argv)
{
int rs;
regex_t preg;
size_t nmatch = 1;
regmatch_t pmatch[1];
char * pattern = "^((0[1-9])|(1[0-2]))\/(\d{4})$";
char inputDate[8];
//Loop until user input matches regex
cout << "Enter Date: ";
cin.getline(inputDate, 8);
if (0 != (rs = regcomp(&preg, pattern, 0))) {
perror("ERROR IN REGCOMP");
exit(1);
}
if (0 != (rs = regexec(&preg, inputDate, nmatch, pmatch, 0))) {
printf("Failed to match '%s' with '%s',returning %d.\n", inputDate, pattern, rs);
perror("ERROR IN REGEXEC");
}
else
printf("Match");
return 0;
}
答案 0 :(得分:2)
首先,您的正则表达式必须"^[0-9][0-9]\\/[0-9][0-9][0-9][0-9]$"
才能匹配MM/YYYY
。
第二,你永远不会编译它。你编译inputDate。
regcomp(&preg, inputDate, REG_EXTENDED)
尝试编译你的模式:
regcomp(&preg, pattern, REG_EXTENDED)
答案 1 :(得分:1)
从模式的末尾删除$
并尝试:
if (0 != (rs = regcomp(&preg, pattern, 0))) {
perror("ERROR IN REGCOMP");
exit(1);
}
if (0 != (rs = regexec(&preg, inputDate, nmatch, pmatch, 0))) {
printf("Failed to match '%s' with '%s',returning %d.\n",
inputDate, pattern, rs);
perror("ERROR IN REGEXEC");
}
else
{
printf("Match");
}