为什么正则表达式" ^ [0-9] | 1 [1-2]"匹配" 13"或" 33"或" 5632"要么

时间:2014-09-12 21:29:34

标签: c++ regex match

为什么正则表达式" ^ [0-9] | 1 [1-2]"匹配" 13"或" 33"或" 5632"或...?

#include <stdio.h>
#include <regex.h>

main() {
    regex_t regex;
    char *reg = "^[0-9]|1[0-2]";
    int reti = regcomp(&regex,reg, REG_NEWLINE | REG_EXTENDED);
    char *meses[] = {"enero","enero","febrero","marzo","abril",
     "mayo","junio","julio","agosto","setiembre",
     "octubre","noviembre","diciembre"};
    char mes[3];
    puts("Ingrese numero de mes [1-12]:");
    fgets(mes,sizeof(mes),stdin);
    if(!regexec(&regex, mes, 0, NULL, 0)) printf("El mes es: %s\n",meses[atoi(mes)]);
    return(0);
}

1 个答案:

答案 0 :(得分:2)

你的正则表达式需要一些调整。

你必须使用这个正则表达式

^([0-9]|1[1-2])$

<强> Working demo

enter image description here

交替运算符(或OR运算符)具有所有正则表达式运算符的最低优先级。所以,你匹配

  ^[0-9]
or
  1[1-2]

这就是为什么你匹配1中的133中的335中的5632

另一方面,使用此正则表达式^([0-9]|1[1-2])$,您将匹配091112的数字,这要归功于锚点({ {1}}和^)以及括号的用法。

修改:在 Maarten 评论时,您的正则表达式也错过了10月,因此您需要将其调整为:

$