diff --git a/include/aidge/utils/DynamicAttributes.hpp b/include/aidge/utils/DynamicAttributes.hpp
index be3bc1a97caa9062308396e378c5ec38c80126e4..352ea0f50af6613dd89ea129472cb2ba35ce424e 100644
--- a/include/aidge/utils/DynamicAttributes.hpp
+++ b/include/aidge/utils/DynamicAttributes.hpp
@@ -19,7 +19,6 @@
 #include <cassert>
 #include <string>
 #include <typeindex>
-#include <regex>
 
 #include "aidge/utils/future_std/any.hpp"
 #include "aidge/utils/Attributes.hpp"
@@ -486,14 +485,24 @@ struct fmt::formatter<T, Char,  std::enable_if_t<std::is_convertible<T*, Aidge::
 
     template<typename FormatContext>
     inline auto format(const Aidge::Attributes& attrs, FormatContext& ctx) const {
+        auto indent = [](const std::string& subAttrs, const std::string& prefix = "  ") {
+            std::string result(prefix);
+            for (size_t i = 0; i < subAttrs.length(); ++i) {
+                result += subAttrs[i];
+                if (subAttrs[i] == '\n') {
+                    result += prefix;
+                }
+            }
+            return result;
+        };
+
         std::string attrsStr;
         for (const auto& attr : attrs.getAttrs()) {
             const auto anyUtilsIt = Aidge::DynamicAttributes::mAnyUtils.find(attr.second.type());
 
             if (attr.second.type() == typeid(Aidge::DynamicAttributes)) {
                 auto subAttrs = anyUtilsIt->second->str(attr.second);
-                subAttrs = std::regex_replace(subAttrs, std::regex("(^|\n)"), "$1  "); 
-                attrsStr += fmt::format("{}:\n{}\n", attr.first, subAttrs);
+                attrsStr += fmt::format("{}:\n{}\n", attr.first, indent(subAttrs));
             }
             else {
                 if (anyUtilsIt != Aidge::DynamicAttributes::mAnyUtils.end()) {