diff --git a/applications/test/regex1/Make/files b/applications/test/regex1/Make/files
index 848466764140441612aa3c616e4a29c2647ff54e..62604e95a5f7697b80cafbda426c86080bd0cdd7 100644
--- a/applications/test/regex1/Make/files
+++ b/applications/test/regex1/Make/files
@@ -1,3 +1,3 @@
-Test-regex1.C
+Test-regex1.cxx
 
 EXE = $(FOAM_USER_APPBIN)/Test-regex1
diff --git a/applications/test/regex1/Test-regex1.C b/applications/test/regex1/Test-regex1.cxx
similarity index 83%
rename from applications/test/regex1/Test-regex1.C
rename to applications/test/regex1/Test-regex1.cxx
index afa467ad582c3c3da1258e105d8a3e2794ab04b7..d38769d70bd8a4f8516e0e4217b04bf88ce93172 100644
--- a/applications/test/regex1/Test-regex1.C
+++ b/applications/test/regex1/Test-regex1.cxx
@@ -35,11 +35,8 @@ Description
 #include "Switch.H"
 
 #include "stringOps.H"
-#include "SubStrings.H"
+#include "regExp.H"
 #include "regExpCxx.H"
-#ifndef _WIN32
-#include "regExpPosix.H"
-#endif
 
 using namespace Foam;
 
@@ -89,20 +86,6 @@ static Ostream& operator<<(Ostream& os, const regExpCxx::results_type& sm)
 }
 
 
-// Simple output of match groups
-#ifndef _WIN32
-static Ostream& operator<<(Ostream& os, const regExpPosix::results_type& sm)
-{
-    for (std::smatch::size_type i = 1; i < sm.size(); ++i)
-    {
-        os << " " << sm.str(i);
-    }
-
-    return os;
-}
-#endif
-
-
 template<class RegexType>
 void generalTests()
 {
@@ -299,10 +282,6 @@ int main(int argc, char *argv[])
     argList::noFunctionObjects();
     argList::noParallel();
 
-    argList::addBoolOption("cxx", "Test C++11 regular expressions");
-    #ifndef _WIN32
-    argList::addBoolOption("posix", "Test POSIX regular expressions");
-    #endif
     argList::addOption
     (
         "regex",
@@ -321,34 +300,16 @@ int main(int argc, char *argv[])
     #ifdef _GLIBCXX_RELEASE
     Info<< "_GLIBCXX_RELEASE = " << (_GLIBCXX_RELEASE) << nl;
     #endif
-
-    if constexpr (std::is_same_v<regExp, regExpCxx>)
-    {
-        Info<< "Foam::regExp uses C++11 regex" << nl;
-    }
-    #ifndef _WIN32
-    if constexpr (std::is_same_v<regExp, regExpPosix>)
-    {
-        Info<< "Foam::regExp uses POSIX regex" << nl;
-    }
+    #ifdef __clang_major__
+    Info<< "__clang_major__ = " << (__clang_major__) << nl;
     #endif
 
     Info<< "sizeof std::regex:  " << sizeof(std::regex) << nl;
-    Info<< "sizeof regex C++11: " << sizeof(regExpCxx) << nl;
-    #ifndef _WIN32
-    Info<< "sizeof regex POSIX: " << sizeof(regExpPosix) << nl;
-    #endif
+    Info<< "sizeof regExp: " << sizeof(Foam::regExp) << nl;
     Info<< "sizeof word: " << sizeof(Foam::word) << nl;
     Info<< "sizeof wordRe: " << sizeof(Foam::wordRe) << nl;
     Info<< "sizeof keyType: " << sizeof(Foam::keyType) << nl;
 
-    if (!args.count({"cxx", "posix"}))
-    {
-        args.setOption("cxx");
-        Info<< "Assuming -cxx as default" << nl;
-    }
-    Info<< nl;
-
     if (args.found("regex"))
     {
         std::string expr(args["regex"]);
@@ -359,31 +320,15 @@ int main(int argc, char *argv[])
             << "quotemeta: "
             << stringOps::quotemeta(expr, regExpCxx::meta()) << nl
             << nl;
-
-        #ifndef _WIN32
-        Info<< "(posix):" << nl
-            << "meta : " << Switch(regExpPosix::is_meta(expr)) << nl
-            << "quotemeta: "
-            << stringOps::quotemeta(expr, regExpPosix::meta()) << nl
-            << nl;
-        #endif
         Info<< nl;
     }
     else if (args.size() < 2)
     {
         Info<< "No test files specified .. restrict to general tests" << nl;
 
-        if (args.found("cxx"))
         {
             generalTests<regExpCxx>();
         }
-
-        #ifndef _WIN32
-        if (args.found("posix"))
-        {
-            generalTests<regExpPosix>();
-        }
-        #endif
     }
 
     for (label argi = 1; argi < args.size(); ++argi)
@@ -394,17 +339,9 @@ int main(int argc, char *argv[])
         Info<< "Test expressions:" << tests << endl;
         IOobject::writeDivider(Info) << endl;
 
-        if (args.found("cxx"))
         {
             testExpressions<regExpCxx>(tests);
         }
-
-        #ifndef _WIN32
-        if (args.found("posix"))
-        {
-            testExpressions<regExpPosix>(tests);
-        }
-        #endif
     }
 
     Info<< "\nDone" << nl << endl;
diff --git a/applications/utilities/miscellaneous/OSspecific/addr2line/Make/files b/applications/utilities/miscellaneous/OSspecific/addr2line/Make/files
index a3dc48dff5b515b589e3932d34f85fee6710fe3a..d7d890a0620c260ff8c66ee1bbccc7cca744dea2 100644
--- a/applications/utilities/miscellaneous/OSspecific/addr2line/Make/files
+++ b/applications/utilities/miscellaneous/OSspecific/addr2line/Make/files
@@ -1,3 +1,3 @@
-addr2line.C
+addr2line.cxx
 
 EXE = $(FOAM_APPBIN)/addr2line
diff --git a/applications/utilities/miscellaneous/OSspecific/addr2line/Make/options b/applications/utilities/miscellaneous/OSspecific/addr2line/Make/options
index 18e6fe47afacb902cddccf82632772447704fd88..fe5842674dae00ba84cb413613fc0b5b99f00c94 100644
--- a/applications/utilities/miscellaneous/OSspecific/addr2line/Make/options
+++ b/applications/utilities/miscellaneous/OSspecific/addr2line/Make/options
@@ -1,2 +1,6 @@
+/* Disable normal project defaults */
+PROJECT_INC =
+PROJECT_LIBS =
+
 /* EXE_INC = */
 /* EXE_LIBS = */
diff --git a/applications/utilities/miscellaneous/OSspecific/addr2line/addr2line.C b/applications/utilities/miscellaneous/OSspecific/addr2line/addr2line.cxx
similarity index 93%
rename from applications/utilities/miscellaneous/OSspecific/addr2line/addr2line.C
rename to applications/utilities/miscellaneous/OSspecific/addr2line/addr2line.cxx
index 6a8345d976915607263623db54754307693c7696..409bcc62d72792adb83f2920b1234e0faafa7d18 100644
--- a/applications/utilities/miscellaneous/OSspecific/addr2line/addr2line.C
+++ b/applications/utilities/miscellaneous/OSspecific/addr2line/addr2line.cxx
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2018 Alexey Matveichev
+    Copyright (C) 2025 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -33,12 +34,11 @@ Description
 
 #include <getopt.h>
 #include <cstdlib>
+#include <regex>
 #include <string>
 #include <vector>
 #include <iostream>
 
-#include "regExp.H"
-#include "SubStrings.H"
 
 static void usage();
 static void version();
@@ -53,7 +53,6 @@ int main(int argc, char *argv[])
     int optHelp = 0, optFunctions = 0, optVersion = 0;
     int ch;
     std::string filename = "a.out";
-    std::vector<std::string> addresses;
 
     static struct option opts[] =
     {
@@ -100,15 +99,9 @@ int main(int argc, char *argv[])
     argc -= optind;
     argv += optind;
 
-    while (argc > 0)
-    {
-        addresses.push_back(std::string(*argv));
-        ++argv;
-        --argc;
-    }
-
-    for (const auto& addr : addresses)
+    for (std::string addr; argc > 0; --argc, ++argv)
     {
+        addr.assign(*argv);
         std::cout<< '\n' << getLine(filename, addr).c_str() << '\n';
     }
 
@@ -190,10 +183,10 @@ std::string getLine(const std::string& filename, const std::string& addr)
         );
 
 
-    Foam::regExp re(".+LineEntry: .+: (.+):([0-9]+):[0-9]+");
+    static std::regex re(".+LineEntry: .+: (.+):([0-9]+):[0-9]+");
+    std::smatch groups;
 
-    Foam::regExp::results_type groups;
-    if (!re.match(line, groups))
+    if (!std::regex_match(line, groups, re))
     {
         line = "??:0";
     }
diff --git a/src/OSspecific/POSIX/Make/files b/src/OSspecific/POSIX/Make/files
index b3cbbb36b98ce6e94a179e13636aed39426aed4a..9f374e56d942c4c71d6f5cff93d02b38c284c0fe 100644
--- a/src/OSspecific/POSIX/Make/files
+++ b/src/OSspecific/POSIX/Make/files
@@ -12,7 +12,6 @@ signals/sigStopAtWriteNow.C
 signals/sigWriteNow.C
 signals/timer.C
 
-regExp/regExpPosix.C
 fileStat/fileStat.C
 
 /*
diff --git a/src/OSspecific/POSIX/regExp/regExp.H b/src/OSspecific/POSIX/regExp/regExp.H
deleted file mode 100644
index 4b53ce6d8237e1a9a7a3f9583aa50a75176dc07c..0000000000000000000000000000000000000000
--- a/src/OSspecific/POSIX/regExp/regExp.H
+++ /dev/null
@@ -1,43 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | www.openfoam.com
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-    Copyright (C) 2019 OpenCFD Ltd.
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-Typedef
-    Foam::regExp
-
-Description
-    Selection of preferred regular expression implementation
-
-\*---------------------------------------------------------------------------*/
-
-#ifndef Foam_regExp_H
-#define Foam_regExp_H
-
-#include "regExpCxx.H"
-#include "regExpPosix.H"
-#include "regExpFwd.H"
-
-#endif
-
-// ************************************************************************* //
diff --git a/src/OSspecific/POSIX/regExp/regExpFwd.H b/src/OSspecific/POSIX/regExp/regExpFwd.H
deleted file mode 100644
index 808e35663ae7dbbee1d33236df297930a12978c2..0000000000000000000000000000000000000000
--- a/src/OSspecific/POSIX/regExp/regExpFwd.H
+++ /dev/null
@@ -1,56 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | www.openfoam.com
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-    Copyright (C) 2019 OpenCFD Ltd.
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-Typedef
-    Foam::regExp
-
-Description
-    Selection of preferred regular expression implementation
-
-\*---------------------------------------------------------------------------*/
-
-#ifndef Foam_regExpFwd_H
-#define Foam_regExpFwd_H
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
-    class regExpCxx;
-    class regExpPosix;
-
-    // Newer compilers support regex directly
-    #if (_GLIBCXX_RELEASE >= 7) || (__clang_major__ >= 7)
-    typedef regExpCxx regExp;
-    #else
-    typedef regExpPosix regExp;
-    #endif
-}
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#endif
-
-// ************************************************************************* //
diff --git a/src/OSspecific/POSIX/regExp/regExpPosix.C b/src/OSspecific/POSIX/regExp/regExpPosix.C
deleted file mode 100644
index 186d0a611d608bdd9a28d9bf3d2a9701b0760bdf..0000000000000000000000000000000000000000
--- a/src/OSspecific/POSIX/regExp/regExpPosix.C
+++ /dev/null
@@ -1,284 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | www.openfoam.com
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-    Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2018-2021 OpenCFD Ltd.
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-\*---------------------------------------------------------------------------*/
-
-#include "regExpPosix.H"
-#include "SubStrings.H"
-#include "error.H"
-
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
-
-int Foam::regExpPosix::grammar(0);
-
-
-// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
-
-namespace
-{
-
-// Matched entire length
-static inline bool fullMatch(const regmatch_t& m, const regoff_t len)
-{
-    return (m.rm_so == 0 && m.rm_eo == len);
-}
-
-} // End anonymous namespace
-
-
-// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
-
-bool Foam::regExpPosix::set_pattern
-(
-    const char* pattern,
-    size_t len,
-    bool ignoreCase
-)
-{
-    clear();  // Also sets ctrl_ = 0
-
-    const char* pat = pattern;
-    bool doNegate = false;
-
-    // Handle known embedded prefixes
-    if (len > 2 && pat[0] == '(' && pat[1] == '?')
-    {
-        pat += 2;
-        len -= 2;
-
-        for (bool done = false; !done && len; ++pat, --len)
-        {
-            switch (*pat)
-            {
-                case '!':
-                {
-                    // Negated (inverted) match
-                    doNegate = true;
-                    break;
-                }
-                case 'i':
-                {
-                    // Ignore-case
-                    ignoreCase = true;
-                    break;
-                }
-                case ')':
-                {
-                    // End of prefix parsing
-                    done = true;
-                    break;
-                }
-            }
-        }
-    }
-
-    // Avoid zero-length patterns
-    if (len)
-    {
-        int flags = REG_EXTENDED;
-        if (ignoreCase)
-        {
-            flags |= REG_ICASE;
-        }
-
-        {
-            preg_ = new regex_t;
-            int err = regcomp(preg_, pat, flags);
-
-            if (err == 0)
-            {
-                ctrl_ = (doNegate ? ctrlType::NEGATED : ctrlType::NORMAL);
-                return true;
-            }
-            else
-            {
-                char errbuf[200];
-                regerror(err, preg_, errbuf, sizeof(errbuf));
-
-                FatalErrorInFunction
-                    << "Failed to compile regular expression '"
-                    << pattern << "'\n" << errbuf
-                    << exit(FatalError);
-            }
-        }
-    }
-
-    return false;
-}
-
-
-// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
-
-bool Foam::regExpPosix::clear()
-{
-    ctrl_ = 0;
-
-    if (preg_)
-    {
-        regfree(preg_);
-        delete preg_;
-        preg_ = nullptr;
-        return true;
-    }
-
-    return false;
-}
-
-
-std::string::size_type Foam::regExpPosix::find(const std::string& text) const
-{
-    // Find with negated is probably not very reliable...
-    if (!preg_ || !ctrl_)
-    {
-        // Undefined: never matches
-        return std::string::npos;
-    }
-    else if (text.empty())
-    {
-        if (ctrl_ == ctrlType::NEGATED)
-        {
-            return 0;  // No match - pretend it starts at position 0
-        }
-        else
-        {
-            return std::string::npos;
-        }
-    }
-    else
-    {
-        const size_t nmatch = 1;
-        regmatch_t pmatch[1];
-
-        const bool ok = (regexec(preg_, text.c_str(), nmatch, pmatch, 0) == 0);
-
-        if (ctrl_ == ctrlType::NEGATED)
-        {
-            if (!ok)
-            {
-                return 0;  // No match - claim that is starts at position 0
-            }
-        }
-        else if (ok)
-        {
-            return pmatch[0].rm_so;
-        }
-    }
-
-    return std::string::npos;
-}
-
-
-bool Foam::regExpPosix::match(const std::string& text) const
-{
-    bool ok = false;
-
-    if (!preg_ || !ctrl_)
-    {
-        // Undefined: never matches
-        return false;
-    }
-
-    const auto len = text.length();
-
-    if (len)
-    {
-        const size_t nmatch = 1;
-        regmatch_t pmatch[1];
-
-        // Verify that the entire string was matched
-        // - [0] is the entire match result
-        ok =
-        (
-            regexec(preg_, text.c_str(), nmatch, pmatch, 0) == 0
-         && fullMatch(pmatch[0], len)
-        );
-    }
-
-    return (ctrl_ == ctrlType::NEGATED ? !ok : ok);
-}
-
-
-bool Foam::regExpPosix::match
-(
-    const std::string& text,
-    SubStrings<std::string>& matches
-) const
-{
-    matches.clear();
-
-    // Probably does not make sense for negated pattern...
-    if (negated())
-    {
-        return match(text);
-    }
-
-    const auto len = text.size();
-    if (preg_ && len)
-    {
-        const size_t nmatch = ngroups() + 1;
-        regmatch_t pmatch[nmatch];
-
-        // Verify that the entire string was matched
-        // - [0] is the entire match result
-        // - [1..] are the match groups (1..)
-        if
-        (
-            regexec(preg_, text.c_str(), nmatch, pmatch, 0) != 0
-         || !fullMatch(pmatch[0], len)
-        )
-        {
-            return false;
-        }
-
-        matches.reserve(nmatch);
-
-        for (size_t matchi = 0; matchi < nmatch; ++matchi)
-        {
-            const auto& mat = pmatch[matchi];
-
-            if (mat.rm_so != -1 && mat.rm_eo != -1)
-            {
-                matches.append
-                (
-                    text.cbegin() + mat.rm_so,
-                    text.cbegin() + mat.rm_eo
-                );
-            }
-            else
-            {
-                // This may be misleading...
-                matches.append(text.cbegin(), text.cbegin());
-            }
-        }
-
-        return true;
-    }
-
-    return false;
-}
-
-
-// ************************************************************************* //
diff --git a/src/OSspecific/POSIX/regExp/regExpPosix.H b/src/OSspecific/POSIX/regExp/regExpPosix.H
deleted file mode 100644
index 8dd72cb6f010d174c15832ea547179526722d75a..0000000000000000000000000000000000000000
--- a/src/OSspecific/POSIX/regExp/regExpPosix.H
+++ /dev/null
@@ -1,270 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | www.openfoam.com
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-    Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2017-2021 OpenCFD Ltd.
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-Class
-    Foam::regExpPosix
-
-Description
-    Wrapper around POSIX extended regular expressions
-    with some additional prefix-handling. The prefix-handling is
-    loosely oriented on PCRE regular expressions and provides a
-    simple means of tuning the expressions.
-
-    The prefixes are detected as \c (?...) at the beginning of
-    the regular expression. Any unknown/unsupported prefixes are silently
-    ignored.
-
-    - "(?!i)" :
-       one or more embedded pattern-match modifiers for the entire pattern.
-    - the \c 'i' indicates ignore-case
-    - the \c '!' (exclamation) indicates negated (inverted) matching
-    .
-
-SeeAlso
-    The manpage regex(7) for more information about POSIX regular expressions.
-    These differ somewhat from \c Perl and \c sed regular expressions.
-
-SeeAlso
-    Foam::regExp and Foam::regExpCxx
-
-Warning
-    This class should not be used directly.
-    Use the Foam::regExp typedef instead.
-
-\deprecated
-    This class will be superseded by Foam::regExpCxx as compiler support
-    for regular expressions continues to improve.
-
-SourceFiles
-    regExpPosix.C
-    regExpPosixI.H
-
-\*---------------------------------------------------------------------------*/
-
-#ifndef Foam_regExpPosix_H
-#define Foam_regExpPosix_H
-
-#include "regExpCxx.H"
-#include <regex.h>
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
-
-// Forward Declarations
-template<class StringType> class SubStrings;
-
-/*---------------------------------------------------------------------------*\
-                         Class regExpPosix Declaration
-\*---------------------------------------------------------------------------*/
-
-class regExpPosix
-{
-    // Data Types
-
-        //- Simple control types
-        enum ctrlType { EMPTY = 0, NORMAL = 1, NEGATED = 2 };
-
-
-    // Private Data
-
-        //- Compiled regular expression
-        regex_t* preg_;
-
-        //- Track if input pattern is non-empty, negated etc.
-        unsigned char ctrl_;
-
-
-    // Private Member Functions
-
-        //- Assign pattern
-        bool set_pattern(const char* pattern, size_t len, bool ignoreCase);
-
-
-public:
-
-    // Public Types
-
-        //- Type for matches - similar to std::smatch
-        typedef SubStrings<std::string> results_type;
-
-
-    // Static Member Data
-
-        //- Grammar (unused) - for compatibility with Foam::regExpCxx
-        static int grammar;
-
-
-    // Static Member Functions
-
-        //- Test if character is a regex meta-character
-        inline static bool is_meta(const char c) noexcept
-        {
-            return regExpCxx::is_meta(c);
-        }
-
-        //- Test if string contains any (unquoted) meta-characters
-        inline static bool is_meta
-        (
-            const std::string& str,
-            const char quote = '\\'
-        )
-        {
-            return regExpCxx::is_meta(str, quote);
-        }
-
-
-    // Public Classes
-
-        //- Functor wrapper for testing meta-characters
-        using meta = regExpCxx::meta;
-
-
-    // Constructors
-
-        //- Default construct
-        inline regExpPosix() noexcept;
-
-        //- Copy construct - disallowed
-        regExpPosix(const regExpPosix&) = delete;
-
-        //- Move construct
-        inline regExpPosix(regExpPosix&& rgx) noexcept;
-
-        //- Construct from character array, optionally ignore case
-        inline explicit regExpPosix
-        (
-            const char* pattern,
-            const bool ignoreCase = false
-        );
-
-        //- Construct from string, optionally ignore case
-        inline explicit regExpPosix
-        (
-            const std::string& pattern,
-            const bool ignoreCase = false
-        );
-
-
-    //- Destructor
-    inline ~regExpPosix();
-
-
-    // Member Functions
-
-    // Access
-
-        //- Return true if a precompiled expression does not exist
-        inline bool empty() const noexcept;
-
-        //- Return true if a precompiled expression exists
-        inline bool exists() const noexcept;
-
-        //- True if pattern matching is negated
-        inline bool negated() const noexcept;
-
-        //- Change pattern negation, return previous value
-        inline bool negate(bool on) noexcept;
-
-        //- The number of capture groups for a non-empty,
-        //- non-negated expressions
-        inline unsigned ngroups() const;
-
-
-    // Editing
-
-        //- Clear expression.
-        //  \return True if expression had existed prior to the clear.
-        bool clear();
-
-        //- Swap contents
-        inline void swap(regExpPosix& rgx);
-
-        //- Compile pattern into a regular expression, optionally ignore case.
-        //  \return True if the pattern was compiled
-        inline bool set(const char* pattern, bool ignoreCase=false);
-
-        //- Compile pattern into a regular expression, optionally ignore case.
-        //  \return True if the pattern was compiled
-        inline bool set(const std::string& pattern, bool ignoreCase=false);
-
-
-    // Matching/Searching
-
-        //- Find position within the text.
-        //  \return The index where it begins or string::npos if not found
-        //
-        //  \note does not properly work with negated regex!
-        std::string::size_type find(const std::string& text) const;
-
-        //- True if the regex matches the entire text.
-        //  The begin-of-line (^) and end-of-line ($) anchors are implicit
-        bool match(const std::string& text) const;
-
-        //- True if the regex matches the text, set the matches.
-        //  The first group starts at index 1 (0 is the entire match).
-        //  The begin-of-line (^) and end-of-line ($) anchors are implicit
-        //
-        //  \note does not properly work with negated regex!
-        bool match(const std::string& text, results_type& matches) const;
-
-        //- Return true if the regex was found within the text
-        inline bool search(const std::string& text) const;
-
-
-    // Member Operators
-
-        //- Perform match on text
-        inline bool operator()(const std::string& text) const;
-
-        //- Copy assignment - disallowed
-        void operator=(const regExpPosix&) = delete;
-
-        //- Move assignment
-        inline void operator=(regExpPosix&& rgx);
-
-        //- Assign and compile pattern from a character array.
-        //  Matching is case sensitive.
-        inline void operator=(const char* pattern);
-
-        //- Assign and compile pattern from string.
-        //  Matching is case sensitive.
-        inline void operator=(const std::string& pattern);
-};
-
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-} // End namespace Foam
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "regExpPosixI.H"
-
-#endif
-
-// ************************************************************************* //
diff --git a/src/OSspecific/POSIX/regExp/regExpPosixI.H b/src/OSspecific/POSIX/regExp/regExpPosixI.H
deleted file mode 100644
index a7a97c80d70fa86205d6109327f90ca7b5dad5aa..0000000000000000000000000000000000000000
--- a/src/OSspecific/POSIX/regExp/regExpPosixI.H
+++ /dev/null
@@ -1,209 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | www.openfoam.com
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-    Copyright (C) 2017-2021 OpenCFD Ltd.
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-\*---------------------------------------------------------------------------*/
-
-#include <utility>  // For std::swap
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-inline Foam::regExpPosix::regExpPosix() noexcept
-:
-    preg_(nullptr),
-    ctrl_(0)
-{}
-
-
-inline Foam::regExpPosix::regExpPosix(regExpPosix&& rgx) noexcept
-:
-    preg_(rgx.preg_),
-    ctrl_(rgx.ctrl_)
-{
-    rgx.preg_ = nullptr;
-    rgx.ctrl_ = 0;
-}
-
-
-inline Foam::regExpPosix::regExpPosix
-(
-    const char* pattern,
-    const bool ignoreCase
-)
-:
-    preg_(nullptr),
-    ctrl_(0)
-{
-    set(pattern, ignoreCase);
-}
-
-
-inline Foam::regExpPosix::regExpPosix
-(
-    const std::string& pattern,
-    const bool ignoreCase
-)
-:
-    preg_(nullptr),
-    ctrl_(0)
-{
-    set(pattern, ignoreCase);
-}
-
-
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-inline Foam::regExpPosix::~regExpPosix()
-{
-    clear();
-}
-
-
-// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
-
-inline bool Foam::regExpPosix::empty() const noexcept
-{
-    return !preg_;
-}
-
-
-inline bool Foam::regExpPosix::exists() const noexcept
-{
-    return preg_;
-}
-
-
-inline bool Foam::regExpPosix::negated() const noexcept
-{
-    return (ctrl_ == ctrlType::NEGATED);
-}
-
-
-inline bool Foam::regExpPosix::negate(bool on) noexcept
-{
-    bool old(ctrl_ == ctrlType::NEGATED);
-
-    if (on)
-    {
-        if (ctrl_)
-        {
-            ctrl_ = ctrlType::NEGATED;
-        }
-    }
-    else if (old)
-    {
-        ctrl_ = ctrlType::NORMAL;
-    }
-
-    return old;
-}
-
-
-inline unsigned Foam::regExpPosix::ngroups() const
-{
-    return (preg_ && ctrl_ == ctrlType::NORMAL) ? preg_->re_nsub : 0;
-}
-
-
-inline bool Foam::regExpPosix::set(const char* pattern, bool ignoreCase)
-{
-    // Silently handle nullptr
-    return set_pattern
-    (
-        pattern,
-        (pattern ? std::char_traits<char>::length(pattern) : 0),
-        ignoreCase
-    );
-}
-
-
-inline bool Foam::regExpPosix::set(const std::string& pattern, bool ignoreCase)
-{
-    return set_pattern
-    (
-        pattern.data(),
-        pattern.length(),
-        ignoreCase
-    );
-}
-
-
-inline bool Foam::regExpPosix::search(const std::string& text) const
-{
-    if (!ctrl_)
-    {
-        return false;
-    }
-    else if (text.empty())
-    {
-        return (ctrl_ == ctrlType::NEGATED);
-    }
-
-    return std::string::npos != find(text);
-}
-
-
-inline void Foam::regExpPosix::swap(regExpPosix& rgx)
-{
-    if (this != &rgx)
-    {
-        // Self-swap is a no-op
-        std::swap(preg_, rgx.preg_);
-        std::swap(ctrl_, rgx.ctrl_);
-    }
-}
-
-
-// * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * * //
-
-inline bool Foam::regExpPosix::operator()(const std::string& text) const
-{
-    return match(text);
-}
-
-
-inline void Foam::regExpPosix::operator=(regExpPosix&& rgx)
-{
-    if (this != &rgx)
-    {
-        // Self-assignment is a no-op
-        clear();
-        swap(rgx);
-    }
-}
-
-
-inline void Foam::regExpPosix::operator=(const char* pattern)
-{
-    set(pattern);
-}
-
-
-inline void Foam::regExpPosix::operator=(const std::string& pattern)
-{
-    set(pattern);
-}
-
-
-// ************************************************************************* //
diff --git a/src/OSspecific/MSwindows/regExp/regExp.H b/src/OpenFOAM/primitives/strings/regex/regExp.H
similarity index 100%
rename from src/OSspecific/MSwindows/regExp/regExp.H
rename to src/OpenFOAM/primitives/strings/regex/regExp.H
diff --git a/src/OSspecific/MSwindows/regExp/regExpFwd.H b/src/OpenFOAM/primitives/strings/regex/regExpFwd.H
similarity index 100%
rename from src/OSspecific/MSwindows/regExp/regExpFwd.H
rename to src/OpenFOAM/primitives/strings/regex/regExpFwd.H
diff --git a/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C b/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C
index 2cdcd038c4ab957f6770e0dd6a68523a37e7ea20..33ae3cd28da8e970def1ba3b5b698d9580a3722e 100644
--- a/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C
+++ b/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C
@@ -30,7 +30,6 @@ License
 #include "clock.H"
 #include "regExp.H"
 #include "IFstream.H"
-#include "SubStrings.H"
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //