【问题标题】:Remove/replace Multicharacters (ÿû) in a C++ String删除/替换 C++ 字符串中的多字符 (ÿû)
【发布时间】:2020-05-20 00:34:00
【问题描述】:

我正在尝试使用 std::tr1::regex 替换字符串中的多字符,因为我找不到任何可以帮助替换它们的函数。代码如下:

// Example program
#include <iostream>
#include <string>
#include <tr1/regex>

void f1()
{
 std::string str = "ÿûABC";
 std::tr1::regex rx("ÿû");
 std::string replacement = "";
 std::tr1::regex_replace(str,rx,replacement);
}

int main()
{
  f1();
  return 0;
}

但我收到以下编译错误。任何人都可以建议是否有任何解决方案或使用 C++98 替换它们的更好选择?

在 4:0 包含的文件中: /usr/include/c++/4.9/tr1/regex:2407:5: 警告:内联函数'_Out_iter std::tr1::regex_replace(_Out_iter, _Bi_iter, _Bi_iter, const std::tr1::basic_regex&, const std:: basic_string&, std::tr1::regex_constants::match_flag_type) [with _Out_iter = std::back_insert_iterator >; _Bi_iter = __gnu_cxx::__normal_iterator >; _Rx_traits = std::tr1::regex_traits; _Ch_type = 字符; std::tr1::regex_constants::match_flag_type = std::bitset]' 使用但从未定义 regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last, ^ /tmp/ccGJXgKd.o:在函数“f1()”中: :(.text+0x81): 未定义引用`std::tr1::basic_regex >::_M_compile()' :(.text+0xc5): 未定义引用`std::back_insert_iterator std::tr1::regex_replace, __gnu_cxx::__normal_iterator, std::tr1::regex_traits, char>(std::back_insert_iterator, __gnu_cxx::__normal_iterator, __gnu_cxx::__normal_iterator, std::tr1::basic_regex > const&, std::basic_string, std::allocator > const&, std::bitset)' collect2:错误:ld 返回 1 个退出状态

【问题讨论】:

  • 普通的std::string::replace怎么样?或者,考虑您的替换,std::string::erase?不要使事情复杂化,正则表达式几乎普遍会使事情复杂化。
  • tr1 不是C++98 的一部分。无论如何,你为什么要用过时的 C++ 方言编程?
  • 您已经大吃一惊了,因为源代码中这些字符的编码是特定于语言环境的。使用 U""u""u8"" 以确保 Unicode。看看ICU,直到 C++ 标准提供完整的 Unicode 功能(C++23 或类似的东西,我还没有放弃希望......)
  • gcc 4.9 有不错的 c++11 支持。为什么要通过对 C++98 的实验性添加来将手绑在背后?这不是为了唠叨或侮辱。如果你有原因,我很想知道它是什么。
  • 目前迫切需要在 C++98 中解决它。

标签: c++ regex c++98 tr1


【解决方案1】:

要从另一个字符串中删除子字符串,您应该使用erase 函数。

例子:

#include<iostream>
#include<string>

int main()
{
    std::string str = "ÿûABC";
    std::string remove = "ÿû";

    std::cout << "Length of source string is " << str.length() << " characters\n";
    std::cout << "Length of string to remove is " << remove.length() << " characters\n";

    size_t pos = str.find(remove);
    if (pos == std::string::npos)
    {
        std::cout << "Substring \"ÿû\" not found\n";
    }
    else
    {
        std::cout << "Found sub-string \"" << remove << "\" at position " << pos << '\n';
        str.erase(pos, remove.length());
        std::cout << "After erasing: \"" << str << "\"\n";
    }
}

来自working example的输出:

Length of source string is 7 characters
Length of string to remove is 4 characters
Found sub-string "ÿû" at position 0
After erasing: "ABC"

这里要注意的重要部分是字符'ÿ''û' 不是单字节!您的编辑器可能将它们保存为每个两个字节,使用 UTF-8 编码。

通过将要删除的子字符串放入其自己的std::string 对象中,我们可以轻松获得erase 调用的实际长度。

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2018-03-28
    • 2011-10-20
    • 2017-03-24
    • 2021-03-20
    相关资源
    最近更新 更多