2017-01-23 120 views
2

我需要檢查月份是否是01-12的形式。我做了一個正則表達式,並採取了輸入來檢查它是否匹配正則表達式。 代碼 -Regexec()沒有給出想要的結果

#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匹配給定的正則表達式

+0

這是一個有趣的C和C++混合,爲什麼?另外,什麼是「年」? –

+0

這不是[最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve) - 您可以刪除與您的問題無關的大量代碼。它也不能同時是C和C++,因爲它們是不同的語言。同樣你的縮進可能會更好。 – Useless

+0

對不起我還是新來的 我現在編輯了代碼 –

回答

1

正則表達式似乎糾正。 嘗試使用從C++ 11

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

根據BRE POSIX標準的正則表達式(當你不所述REG_EXTENDED標誌傳遞到regcomp),則|管交替操作,相同(/){n,m}字符只有當你逃脫時纔會變得「特別」。當使用ERE POSIX正則表達式的味道(當你通過REG_EXTENDEDregcomp),它正好相反,轉義()|{n,m}是特殊的。

所以,你的代碼可以被固定爲

string monthRegex = "0[1-9]\\|1[0-2]"; 

刪除(和被視爲BRE文字符號),管前添加轉義符。

請參閱C++ demo

否則,使用REG_EXTENDED標誌和使用自己的正則表達式:

rc = regcomp(&preg, monthRegex.c_str(), REG_NOSUB|REG_EXTENDED) 
                ^^^^^^^^^^^^ 

然而,最好是在C++代碼中使用std::regex,看arturx64's answer

相關問題