【问题标题】:C++ regex with char and wchar_t?带有 char 和 wchar_t 的 C++ 正则表达式?
【发布时间】:2023-04-10 02:45:01
【问题描述】:

我有一个 const char 和一个 const wchar_t。我下面的函数适用于 char。编写可以轻松处理 char 和 wchar_t 的函数的最简单/最有效的方法是什么?

    const char* asciiChar = "this is an ascii string";
    const wchar_t* unicodeChar = L"this is a unicode string";

    std::string replaceSubstring(const char* find, const char* asciiChar, const char* replace)
    {
        std::string const text(str);
        std::regex const reg(find);
        std::string const newStr = std::regex_replace(text, reg, replace);
        return newStr;
    }

【问题讨论】:

    标签: c++ regex string char wchar


    【解决方案1】:

    正是由于这个原因,regexbasic_regex<char> 的 typedef,就像 stringbasic_string<char> 的 typedef。知道了这一点,您就可以摆脱单一模板:

    template<typename CharType>
    std::basic_string<CharType>
      replaceSubstring(const CharType* find, const CharType* str, const CharType* rep)
    {
        std::basic_string<CharType> text(str);
        std::basic_regex<CharType> reg(find);
        return std::regex_replace(text, reg, rep);
    }
    

    这会正确处理 char 指针和 wchar_t 指针,并返回正确类型的字符串。您可能也想接受const std::basic_string&lt;CharType&gt;&amp; 参数。

    【讨论】:

    【解决方案2】:

    你可以使用另一个函数来重载函数:

        std::wstring replaceSubstring(const wchar_t* find, const wchar_t* asciiChar, const wchar_t* replace)
        {
            std::wstring const text(str);
            std::wregex const reg(find);
            std::wstring const newStr = std::wregex_replace(text, reg, replace);
            return newStr;
        }
    

    【讨论】:

      【解决方案3】:

      您可以为此使用模板,如下所示,

      template<typename CharT>
      const CharT* replaceSubstring(const CharT* find, const CharT* str, const CharT* replace);
      
      template<> const char* replaceSubstring<char>(const char* find, const char* str, const char* replace) 
      {
          std::string const text(str);
          std::regex const reg(find);
      
          std::string swap_str(replace);
      
          return std::regex_replace(text, reg, swap_str).c_str();
      }
      
      template<> const wchar_t* replaceSubstring<wchar_t>(const wchar_t* find, const wchar_t* str, const wchar_t* replace) 
      {   
          std::wstring const text(str);
          std::wregex const reg(find);
      
          std::wstring swap_str(replace);
      
          return std::regex_replace(text, reg, swap_str).c_str();
      }
      

      此外,重载可以是另一种选择。

      你可以从下面的链接中得到好的建议。

      Is it possible to have a C++ method accept either const char* and const wchar_t* as a parameter without overloading the method?

      【讨论】:

      • 真的需要使用显式特化吗?在我看来,您可以简单地编写函数以使用 char 或 wchar_t。 std::basic_string&lt;CharT&gt; const text(str);
      • 是的,你是对的。我认为@Brian 的代码更有用更简单。
      猜你喜欢
      • 2014-07-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2011-01-17
      • 2011-04-16
      • 1970-01-01
      相关资源
      最近更新 更多