// file : libbutl/regex.mxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef __cpp_modules_ts #pragma once #endif // C includes. #ifndef __cpp_lib_modules_ts #include #include #include #include // pair #include #include // size_t #include // move(), make_pair() #endif #if defined(__clang__) # if __has_include(<__config>) # include <__config> // _LIBCPP_VERSION # endif #endif // Other includes. #ifdef __cpp_modules_ts export module butl.regex; #ifdef __cpp_lib_modules_ts import std.core; import std.io; import std.regex; // @@ MOD TODO should probably be re-exported. #endif #endif #include LIBBUTL_MODEXPORT namespace butl { // The regex semantics for the following functions is like that of // std::regex_replace() extended the standard ECMA-262 substitution escape // sequences with a subset of Perl sequences: // // \\, \n, \u, \l, \U, \L, \E, \1, ..., \9 // // Notes and limitations: // // - The only valid regex_constants flags are match_default, // format_first_only and format_no_copy. // // - If backslash doesn't start any of the listed sequences then it is // silently dropped and the following character is copied as is. // // - The character case conversion is performed according to the global // C++ locale (which is, unless changed, is the same as C locale and // both default to the POSIX locale aka "C"). // // Call specified append() function for non-matched substrings and matched // substring replacements returning true if search succeeded. The function // must be callable with the following signature: // // void // append(basic_string::iterator begin, basic_string::iterator end); // template bool regex_replace_search (const std::basic_string&, const std::basic_regex&, const std::basic_string& fmt, F&& append, std::regex_constants::match_flag_type = std::regex_constants::match_default); // As above but concatenate non-matched substrings and matched substring // replacements into a string returning it as well as whether the search // succeeded. // template std::pair, bool> regex_replace_search (const std::basic_string&, const std::basic_regex&, const std::basic_string& fmt, std::regex_constants::match_flag_type = std::regex_constants::match_default); // Match the entire string and, if it matches, return the string replacement. // template std::pair, bool> regex_replace_match (const std::basic_string&, const std::basic_regex&, const std::basic_string& fmt); } LIBBUTL_MODEXPORT namespace std { // Print regex error description but only if it is meaningful (this is also // why we have to print leading colon). // LIBBUTL_SYMEXPORT ostream& operator<< (ostream&, const regex_error&); } #include #include