2016-05-04 1 views
1

Я использую следующий код C++ с обновлением V2 VS2013 и обновлением VS2015 3 с использованием диапазона символов, чтобы попробовать чтобы соответствовать случай нечувствительно и заменить вхождения::: std :: regex_replace с синтаксическим флагом icase в Windows (обновление VS2013 4, обновление VS2015 3) не соответствует диапазонам символов

std::wstring strSource(L"Hallo Welt, HALLO WELT"); 
std::wstring strReplace(L"ello"); 
std::regex_constants::syntax_option_type nReFlags = 
    std::regex::ECMAScript | 
    std::regex::optimize | 
    std::regex::icase; 
std::wregex re(L"[A]LLO", nReFlags); 
std::wstring strResult = std::regex_replace(strSource, re, strReplace); 

wcout << L"Source: \"" << strSource.c_str() << L"\"" << endl 
     << L"Result: \"" << strResult.c_str() << L"\"" << endl; 

Я ожидал, что выход:

Source: "Hallo Welt, HALLO WELT" 
Result: "Hello Welt, Hello WELT" 

Но я получаю:

Source: "Hallo Welt, HALLO WELT" 
Result: "Hello Welt, HALLO WELT" 

Почему диапазон символов не получил применение caseinsensitive? Почему второй матч, похоже, не найден и его заменили?

ответ

1

Я чувствую, что это может быть ошибкой в ​​Visual Studio. Если вы удалите скобки с [A], он отлично работает.

std::wregex re(L"ALLO", nReFlags); 

Как ни странно, если вы используете regex_search он находит 2 матча ...

std::wregex re(L"([A]LLO)", nReFlags); 
std::wsmatch match; 
std::regex_search(strSource, match, re); 
for (auto i = 0; i < match.size(); ++i) 
    std::wcout << match[i] << "\n";