我用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,升壓:1.51),I看到以下內容:
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
在這裏是正確的?
Boost很可能是正確的,因爲並非所有標準庫都完全實現了C++ 11。正則表達式庫似乎迄今爲止最容易被忽略,至少在GCC中,而Visual C++中的支持似乎更好。 –
您提供的輸出不能來自您提供的程序。你有'std :: string pat = prefix +「\\。\\ *。*?」;',所以如果'prefix'是'FOO。*',那麼'pat'必須是'FOO。* \ 。\ *。*?',而不是'FOO。*?'。 –
@j_random_hacker,是的 - 對不起,我只是改變了代碼片段 - 如果你運行它,你會得到相同的結果.. – Nim