【发布时间】: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 中解决它。