Было бы гораздо лучше преобразовать число в число с плавающей точкой, а затем использовать форматирование строки, т. Е. Использовать
char buffer [50];
sprintf(buffer, "%E", ...)
)
или spritnf(buffer, "%fE%d", ..., ...)
, если для каких-либо действий это будет работать лучше.
В любом случае, регулярное выражение должно выглядеть примерно так:
([+-]?)0*(\d+)(?:(\.\d*[1-9])|\.)0*(?:([Ee][+-]?)0*(\d+))?
(см. regex101.com ), и тогда шаблон замещения будет
$1$2$3$4$5
так что у вас есть все в соответствующих группах, кроме нулей, и затем вы заменяете его содержимым всех соответствующих групп.
Осталось выйти из вышеприведенного выражения и разобраться с \d
для цифр - я видел, что вы используете [[:digit:]]
вместо.