Страницы

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

воскресенье, 1 декабря 2019 г.

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

#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. Я написал в их службу поддержки по этому поводу.

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

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