/ / प्रोत्साहन के बीच असंगतता :: regex और std :: regex [डुप्लिकेट] - c ++, regex, बढ़ावा, c ++ 11

बूस्ट :: रेगेक्स और एसडीडी :: रेगेक्स [डुप्लिकेट] के बीच असंगतता - सी ++, रेगेक्स, बूस्ट, सी ++ 11

संभावित डुप्लिकेट:
C ++ 11 regex से कोई मेल नहीं खाता

मैं उपयोग कर रहा था boost::regex कुछ सामान के लिए पहले और कुछ नए सामान के लिए मैं उपयोग करना चाहता था std::regex जब तक मैंने निम्नलिखित असंगतता पर ध्यान नहीं दिया - तब तक सवाल यह है कि कौन सा सही है?

#include <iostream>
#include <regex>
#include <string>

#include <boost/regex.hpp>

void test(std::string prefix, std::string str)
{
std::string pat = prefix + "\.\*.*?";

std::cout << "Input   : [" << str << "]" << std::endl;
std::cout << "Pattern : [" << pat << "]" << std::endl;

{
std::regex r(pat);
if (std::regex_match(str, r))
std::cout << "std::regex_match: true" << std::endl;
else
std::cout << "std::regex_match: false" << std::endl;

if (std::regex_search(str, r))
std::cout << "std::regex_search: true" << std::endl;
else
std::cout << "std::regex_search: false" << std::endl;
}

{
boost::regex r(pat);
if (boost::regex_match(str, r))
std::cout << "boost::regex_match: true" << std::endl;
else
std::cout << "boost::regex_match: false" << std::endl;

if (boost::regex_search(str, r))
std::cout << "boost::regex_search: true" << std::endl;
else
std::cout << "boost::regex_search: false" << std::endl;
}
}

int main(void)
{
test("FOO", "FOO.*");
test("FOO", "FOO.*.*.*.*");
}

मेरे लिए (gcc 4.7.2, -std = c ++ 11, boost: 1.51), मैं निम्नलिखित देखता हूं:

Input   : [FOO.*]
Pattern : [FOO.*.*?]
std::regex_match: false
std::regex_search: false
boost::regex_match: true
boost::regex_search: true
Input   : [FOO.*.*.*.*]
Pattern : [FOO.*.*?]
std::regex_match: false
std::regex_search: false
boost::regex_match: true
boost::regex_search: true

अगर मैं पैटर्न को एक लालची पैटर्न में बदलता हूं (.*), फिर मैं देखता हूं:

Input   : [FOO.*]
Pattern : [FOO.*.*]
std::regex_match: true
std::regex_search: false
boost::regex_match: true
boost::regex_search: true
Input   : [FOO.*.*.*.*]
Pattern : [FOO.*.*]
std::regex_match: true
std::regex_search: false
boost::regex_match: true
boost::regex_search: true

किस पर विश्वास करें? मुझे लगता है कि होगा boost क्या यहाँ सही है?

उत्तर:

उत्तर № 1 के लिए 6

जीसीसी कोर्स t1 / c ++ 11 रेगेक्स का समर्थन नहीं करता है, लेकिन अधिक सामान्य उत्तर देने के लिए, boost.regex का डिफ़ॉल्ट है पर्ल ५इसके प्रलेखन के अनुसार, जबकि C ++ डिफ़ॉल्ट है ECMAScript, POSIX BRE के कई स्थानीय-निर्भर तत्वों द्वारा बढ़ाया गया है।

विशेष रूप से, boost.regex पर्ल एक्सटेंशन का समर्थन करता है यहाँ सूचीबद्ध है।, लेकिन आप उनमें से किसी का भी उपयोग नहीं कर रहे हैं।

अब, मैं उत्सुक हो गया और आपके परीक्षण को दो और संकलकों के माध्यम से चलाया:

क्लैंग से उत्पादन:

~ $ clang++ -o test test.cc -std=c++11 -I/usr/include/c++/v1 -lc++ -lboost_regex
~ $ ./test
Input   : [FOO.*]
Pattern : [FOO.*.*?]
std::regex_match: true
std::regex_search: true
boost::regex_match: true
boost::regex_search: true
Input   : [FOO.*.*.*.*]
Pattern : [FOO.*.*?]
std::regex_match: false
std::regex_search: true
boost::regex_match: true
boost::regex_search: true

विजुअल स्टूडियो 2012 से आउटपुट (एसएएस बूस्ट)

Input   : [FOO.*]
Pattern : [FOO.*.*?]
std::regex_match: true
std::regex_search: true
Input   : [FOO.*.*.*.*]
Pattern : [FOO.*.*?]
std::regex_match: true
std::regex_search: true

क्लैंग की विसंगति को करीब से देखते हुए, दूसरे टेस्ट में यह पैटर्न से मेल खाता था [FOO.*.*?] सेवा मेरे [FOO.*] और चला गया [.*.*.*] बेजोड़, जो जल्दी से मेल खाती है [S*?] बढ़ावा / दृश्य स्टूडियो से अलग .. जो, मुझे लगता है, एक बग भी है।