#cpp #регулярные_выражения #ideone
Следующий код в 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 << '\n'; 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 << '\n'; 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 << '\n'; 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<> Что логично - группы нет, но замена со стиранием хвоста есть.
Ответы
Ответ 1
Судя по всему это не баг ideone, а баг gcc, появившийся где-то в районе версии 5. 4.9.3 дает: x<> 5.1.0 дает: x<1>Ответ 2
Как верно указал @ReinRaus, это действительно баг Ideone. Я написал в их службу поддержки по этому поводу.
Комментариев нет:
Отправить комментарий