确保用户输入的日期在年月日

Ensuring user input of date is in (MM/YY)

本文关键字:年月日 日期 用户 输入 确保      更新时间:2023-10-16

我需要验证用户输入的日期是否为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-9][0-9]\/[0-9][0-9][0-9][0-9]$"才能匹配MM/YYYY

第二,你从来没有编译过它。你编译inputDate。

regcomp(&preg, inputDate, REG_EXTENDED)

尝试编译你的模式:

regcomp(&preg, pattern, REG_EXTENDED)

从模式末尾删除$并尝试以下操作:

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