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

Qwertiy

Следующий код в VS2015 выводит x, но в ideone результат почему-то x1. Почему??

http://ideone.com/K5ZKxR

#include <iostream>
#include <string>
#include <regex>

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;
}
</regex></string></iostream>

В приведённом примере совпадение должно идти только по последней ветви |\\d{10}$, т. е. все группы должны быть пустыми. Т. о. должен удалиться добавленный хвост из 10 цифр. Но откуда-то берётся цифра 1. Из-за чего так происходит? И как исправить?

Уменьшил пример http://ideone.com/THHiay

#include <iostream>
#include <string>
#include <regex>

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;
}
</regex></string></iostream>
x<1>

При этом другие нули в строке не портятся (меняются только перед девятками и дефисом) http://ideone.com/XcFF6M

#include <iostream>
#include <string>
#include <regex>

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;
}
</regex></string></iostream>
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<>

Что логично - группы нет, но замена со стиранием хвоста есть.

2 ответа

Qwertiy

Судя по всему это не баг ideone, а баг gcc, появившийся где-то в районе версии 5.

4.9.3 дает:

x<>

5.1.0 дает:

x<1>


Qwertiy

Как верно указал @ReinRaus, это действительно баг Ideone.

Я написал в их службу поддержки по этому поводу.

licensed under cc by-sa 3.0 with attribution.