Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

Откуда берётся лишняя цифра?

Следующий код в VS2015 выводит x, но в ideone результат почему-то x1. Почему??
http://ideone.com/K5ZKxR
#include #include #include
using namespace std;
int main() { string s = "x";
s = regex_replace(s + "0123456789", regex("(\\b(?=9.*(1))|0(?=.*(1))|1(?=.*(2))|2(?=.*(3))|3(?=.*(4))|4(?=.*(5))|5(?=.*(6))|6(?=.*(7))|7(?=.*(8))|8(?=.*(9))|9(?=.*(0)))(?=9*-)|\\d{10}$"), "$2$3$4$5$6$7$8$9$10$11$12"); cout << s << '
';
return 0; }
В приведённом примере совпадение должно идти только по последней ветви |\\d{10}$, т. е. все группы должны быть пустыми. Т. о. должен удалиться добавленный хвост из 10 цифр. Но откуда-то берётся цифра 1. Из-за чего так происходит? И как исправить?

Уменьшил пример http://ideone.com/THHiay
#include #include #include
using namespace std;
int main() { string s = "x";
s = regex_replace(s + "0123456789", regex("0(?=.*(1))(?=9*-)|\\d{10}$"), "<$1>"); cout << s << '
';
return 0; }

x<1>
При этом другие нули в строке не портятся (меняются только перед девятками и дефисом) http://ideone.com/XcFF6M
#include #include #include
using namespace std;
int main() { string s = "100#100-100,101#101-101,109#109-109";
s = regex_replace(s + "0123456789", regex("0(?=.*(1))(?=9*-)|\\d{10}$"), "<$1>"); cout << s << '
';
return 0; }
100#10<1>-100,101#101-101,109#1<1>9-109<1>
Тем временем, VS на последний пример выдаёт
100#10<1>-100,101#101-101,109#1<1>9-109<>
Что логично - группы нет, но замена со стиранием хвоста есть.


Ответ

Судя по всему это не баг ideone, а баг gcc, появившийся где-то в районе версии 5.
4.9.3 дает:
x<>
5.1.0 дает:
x<1>

Комментариев нет:

Отправить комментарий