Разное поведение regex в Win и Unix
Пишу на с++ обработку с помощью std::regex и заметил разное поведение в windows и unix якоря конца строки $.
В качестве Unix подсистема Ubuntu 20.04 LTS на WSL2.
Компилятор g++ : g++ main.cpp -o test
Простой пример.
Код:
if (file.is_open())
{
getline(file, s);
}
file.close();
std::regex r(R"(SOME$)");
const vector<string> syntax_error{
sregex_token_iterator{s.cbegin(), s.cend(), r, -1},
sregex_token_iterator{}
};
for (auto error : syntax_error)
{
cout << error << endl;
}
Входной файл:
SOME
/
Вывод в unix:
SOME
Вывод в Windows(visual studio) пустой, т.е корректный.
Пробовал менять $ на \n, результат тот же. Как добиться одинакового поведения?
Файл input.txt тот же.
Ответы (1 шт):
Мне удалось воспроизвести эту "ошибку". Как я и думал, проблема не в регулярках, с ними все в порядке. Проблема именно в том, что
Файл input.txt тот же.
да да, что он именно физически один и тот же.
Дело в том, что в Linux и windows приняты разные символы перевода строк. В Linux это 0x0A, в Windows это Ox0D 0x0A. И когда в Linux читается строка, то там на самом деле читается чуточку больше - там получается SOME\0x0D (то есть, ещё один байт). В этом легко убедится, если распечатать длину прочитанной строки. А раз строки разные, то и результат очевидно может быть разным.
Что делать? например, попробовать отрезать этот символ в конце
if (s.back() == 13) s.pop_back();
или просто использовать нативные переводы строк в файле.