diff --git a/http/utility.hpp b/http/utility.hpp
index f7e456b..a1561b0 100644
--- a/http/utility.hpp
+++ b/http/utility.hpp
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <bmcweb_config.h>
 #include <openssl/crypto.h>
 
 #include <boost/date_time/posix_time/posix_time.hpp>
@@ -11,7 +12,6 @@
 #include <ctime>
 #include <functional>
 #include <limits>
-#include <regex>
 #include <stdexcept>
 #include <string>
 #include <string_view>
@@ -733,48 +733,87 @@
     return details::readUrlSegments(urlView, {std::forward<Args>(args)...});
 }
 
+inline std::string setProtocolDefaults(const boost::urls::url_view& url)
+{
+    if (url.scheme() == "https")
+    {
+        return "https";
+    }
+    if (url.scheme() == "http")
+    {
+        if (bmcwebInsecureEnableHttpPushStyleEventing)
+        {
+            return "http";
+        }
+        return "";
+    }
+    return "";
+}
+
+inline uint16_t setPortDefaults(const boost::urls::url_view& url)
+{
+    uint16_t port = url.port_number();
+    if (port != 0)
+    {
+        // user picked a port already.
+        return port;
+    }
+
+    // If the user hasn't explicitly stated a port, pick one explicitly for them
+    // based on the protocol defaults
+    if (url.scheme() == "http")
+    {
+        return 80;
+    }
+    if (url.scheme() == "https")
+    {
+        return 443;
+    }
+    return 0;
+}
+
 inline bool validateAndSplitUrl(std::string_view destUrl, std::string& urlProto,
-                                std::string& host, std::string& port,
+                                std::string& host, uint16_t& port,
                                 std::string& path)
 {
-    // Validate URL using regex expression
-    // Format: <protocol>://<host>:<port>/<path>
-    // protocol: http/https
-    const std::regex urlRegex(
-        "(http|https)://([^/\\x20\\x3f\\x23\\x3a]+):?([0-9]*)(/"
-        "([^\\x20\\x23\\x3f]*\\x3f?([^\\x20\\x23\\x3f])*)?)");
-    std::cmatch match;
-    if (!std::regex_match(destUrl.begin(), destUrl.end(), match, urlRegex))
+    boost::string_view urlBoost(destUrl.data(), destUrl.size());
+    boost::urls::result<boost::urls::url_view> url =
+        boost::urls::parse_uri(urlBoost);
+    if (!url)
+    {
+        return false;
+    }
+    urlProto = setProtocolDefaults(url.value());
+    if (urlProto.empty())
     {
         return false;
     }
 
-    urlProto = std::string(match[1].first, match[1].second);
-    if (urlProto == "http")
-    {
-#ifndef BMCWEB_INSECURE_ENABLE_HTTP_PUSH_STYLE_EVENTING
-        return false;
-#endif
-    }
+    port = setPortDefaults(url.value());
 
-    host = std::string(match[2].first, match[2].second);
-    port = std::string(match[3].first, match[3].second);
-    path = std::string(match[4].first, match[4].second);
-    if (port.empty())
-    {
-        if (urlProto == "http")
-        {
-            port = "80";
-        }
-        else
-        {
-            port = "443";
-        }
-    }
+    host = std::string_view(url->encoded_host().data(),
+                            url->encoded_host().size());
+
+    path = std::string_view(url->encoded_path().data(),
+                            url->encoded_path().size());
     if (path.empty())
     {
         path = "/";
     }
+    if (url->has_fragment())
+    {
+        path += '#';
+        path += std::string_view(url->encoded_fragment().data(),
+                                 url->encoded_fragment().size());
+    }
+
+    if (url->has_query())
+    {
+        path += '?';
+        path += std::string_view(url->encoded_query().data(),
+                                 url->encoded_query().size());
+    }
+
     return true;
 }
 
