2017-01-23 6 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; 
} 

入力 = 09。 mon = 09; 出力は「なし」

しかし09試合与えられた正規表現

+0

これはCとC++の面白い組み合わせです、なぜですか?また、「年」とは何ですか? –

+0

これは[最小限で完全で検証可能な例](https://stackoverflow.com/help/mcve)ではありません。あなたの質問には関係のないたくさんのコードを削除することができます。また、CとC++の両方にすることはできません。異なる言語なのでです。また、あなたの圧痕はより良いかもしれません。 – Useless

+0

申し訳ありませんこのコードを新しくしました コードを編集しました –

答えて

1

正規表現ではありません修正しているようです。 BRE POSIX標準(あなたがregcompREG_EXTENDEDフラグを渡していない場合)、(/){n,m}文字と同じ|パイプ交代演算子によると、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

から正規表現を使用してみてくださいあなたがそれらをエスケープするときだけ "特別な"になります。 (あなたがregcompREG_EXTENDEDを渡すとき)EREのPOSIX正規表現の風味を使用している場合、それはちょうど反対で、エスケープ()|{n,m}は特別です。

だから、あなたのコードは、BREにリテラルシンボルとして扱われ()を外し、パイプの前にエスケープ記号を追加

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

として固定することができます。

C++ demoを参照してください。エルス

は、REG_EXTENDEDフラグを使用して、独自の正規表現を使用します。

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

しかし、arturx64's answerを参照してください、C++コードでstd::regexを使用することをお勧めします。

関連する問題