确保用户输入日期为(MM / YY)

时间:2016-04-20 17:29:28

标签: c++ regex pattern-matching

我需要验证日期的用户输入格式为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;
}

2 个答案:

答案 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");
}