Regexec()没有给出所需的结果

时间:2017-01-23 10:50:06

标签: c++ c regex

我需要检查月份是否为01-12。我做了一个正则表达式并接受输入以检查它是否与正则表达式匹配。 代码 -

#include <iostream>
#include<string>
using namespace std;
#include<regex.h>
#include<stdio.h>


int main()
{
 int a;
 cin>>a;
 cout << "Hello World" << endl; 
 string mon;
 cin>>mon;
 string exp_month = mon;
 string monthRegex = "(0[1-9]|1[0-2])";
 regex_t    preg;
 int        rc;

 if (0 != (rc = regcomp(&preg, monthRegex.c_str(), REG_NOSUB))) {
    cout<<("regcomp() failed, returning nonzero (%d)\n", rc);
    exit(EXIT_FAILURE);
   }


 if (regexec(&preg,exp_month.c_str(),0,NULL,0)==0)
 {
    cout<<"yess";  
 }
 else
 {
     cout<<"no";
 }
 return 0;
}

输入 a = 09; mon = 09; 输出是“否”

但09匹配给定的正则表达式

2 个答案:

答案 0 :(得分:1)

正则表达似乎是正确的。 尝试使用C ++ 11中的regexp

cout << "Hello World" << endl;
string mon;
cin >> mon;
string monthRegex = "(0[1-9]|1[0-2])";
std::regex rex ( monthRegex );

if ( std::regex_match ( mon, rex ) )
{
    std::cout << "Matched\n";
}
else
{
    std::cout << "Not matched\n";
}

答案 1 :(得分:1)

根据BRE POSIX标准(当您未将REG_EXTENDED标记传递给regcomp时),|管道更改操作符,与( / {{相同只有当你逃避它们时,1}}和)个字符才会变得“特殊”。当使用ERE POSIX正则表达式风格时(当您将{n,m}传递给REG_EXTENDED时),情况正好相反,未转义 regcomp()|很特别。

因此,您的代码可以修复为

{n,m}

删除在BRE中被视为文字符号的string monthRegex = "0[1-9]\\|1[0-2]"; (,并在管道前添加转义符号。

请参阅C++ demo

否则,请使用)标志并使用您自己的正则表达式:

REG_EXTENDED

但是,建议在C ++代码中使用rc = regcomp(&preg, monthRegex.c_str(), REG_NOSUB|REG_EXTENDED) ^^^^^^^^^^^^ ,请参阅arturx64's answer