Вы правы.Ваш пример не работает на Mac OS.Я сталкиваюсь с той же проблемой, если я запускаю ее на Mac.
В вашем последнем комментарии был задан вопрос "как заставить его работать в MAC OS, пожалуйста", который, как я предполагаю, запрашивает код, чтобы заставить эту работу работать наMac, а не спрашивать, почему две реализации регулярных выражений дают разные результаты.Это гораздо более простое решение:
Это работает на моем Mac:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
// std::regex reg("[\\s\\S]*abc[\\s\\S]*:(\\S+)");
std::regex reg("[\\s\\S]*abc.*:(\\S+)");
std::string src = " abc-def gg, :OK";
std::smatch match;
bool flag = std::regex_search(src, match, reg);
std::cout << flag;
return 0;
}
То же выражение, которое работает на regex101.com, не работает на Mac (llvm).Кажется, что [\ s \ S] не работает хорошо с использованием библиотеки регулярных выражений Mac, но это можно решить, заменив [\ s \ S] на .*
.
В ответ на дальнейший запросизолировать часть строки «ОК», что делается с помощью групп.Группа [0] всегда полностью совпадает.группа [1] - следующая часть появляется в скобках (...)
Этот код иллюстрирует, как извлечь две группы.Пожалуйста, примите ответ.
#include <iostream>
#include <regex>
#include <string>
using namespace std;
std::string GetMatch() {
// std::regex reg("[\\s\\S]*abc[\\s\\S]*:(\\S+)");
std::regex reg("[\\s\\S]*abc.*:(\\S+)");
std::string src = " abc-def gg, :OK";
std::smatch matches;
bool flag = std::regex_search(src, matches, reg);
std::cout << flag;
for(size_t i=0; i<matches.size(); ++i) {
cout << "MATCH: " << matches[i] << endl;
}
return matches[1];
}
int main() {
std::string result = GetMatch();
// match
cout << "The result is " << result << endl;
return 0;
}