c++标椎库:文本处理

本文介绍了C++中的字符串类string,包括其与Unicode的兼容性问题,以及C++11引入的字面量后缀"s"、原始字符串和字符串转换函数。同时讲解了C++11的正则表达式库regex,提供了正则表达式的使用示例,并强调了在处理文本时使用正则表达式的重要性。总结中指出,虽然C++的文本处理工具有限,但通过掌握核心技巧,仍能有效处理文本。
摘要由CSDN通过智能技术生成

字符串

对于 C++ 里的字符串类 string,string 其实并不是一个“真正的类型”,而是模板类 basic_string 的特化形式,是一个 typedef:

using string = std::basic_string<char>;  // string其实是一个类型别名

所谓的字符串,就是字符的序列。字符是人类语言、文字的计算机表示,而人类语言、文字又有很多种,相应的编码方式也有很多种。

所以,C++ 就为字符串设计出了模板类 basic_string,再用模板来搭配不同的字符类型,就能够更有“弹性”地处理各种文字了。 在字符编码方面,Unicode,它的目标是用一种编码方式统一处理人类语言文字,使用 32 位(4 个字节)来保证能够容纳过去或者将来所有的文字。但这就与 C++ 产生了矛盾。因为 C++ 的字符串源自 C,而 C 里的字符都是单字节的 char 类型,无法支持 Unicode。

为了解决这个问题,C++ 就又新增了几种字符类型。C++98 定义了 wchar_t,到了 C++11,为了适配 UTF-16、UTF-32,又多了 char16_t、char32_t。于是,basic_string 在模板参数里换上这些字符类型之后,就可以适应不同的编码方式了。

using wstring = std::basic_string<wchar_t>;
using u16string = std::basic_string<char16_t>;
using u32string = std::basic_string<char32_t>;

虽然 C++ 做了这些努力,但其实收效并不大。因为字符编码和国际化的问题实在是太复杂了,仅有这几个基本的字符串类型根本不够,而 C++ 一直没有提供处理编码的配套工具,我们只能“自己造轮子”,用不好反而会把编码搞得一团糟。这就导致 wstring 等新字符串基本上没人用,大多数程序员为了不“自找麻烦”,还是选择最基本的 string。万幸的是 Unicode 还有一个 UTF-8 编码方式,与单字节的 char 完全兼容,用 string 也足以适应大多数的应用场合。所以,建议只用 string,而且在涉及 Unicode、编码转换的时候,尽量不要用 C++,目前它还不太擅长做这种工作,可能还是改用其他语言来处理更好。

 

String 在 C++ 标准库里的身份也是比较特殊,虽然批评它的声音有不少,比如接口复杂、成本略高,但不像容器、算法,直到现在,仍然有且只有这么一个字符串类,“只此一家,别无分号”。所以,在这种“别无选择”的情况下,我们就要多了解它的优缺点,尽量用好它。首先,string 是一个功能比较齐全的字符串类,可以提取子串、比较大小、检查长度、搜索字符……基本满足一般人对字符串的“想象”。

string str = "abc";

assert(str.length() == 3); 
assert(str < "xyz");
assert(str.substr(0, 1) == "a");
assert(str[1] == 'b');
assert(str.find("1") == string::npos);
assert(str + "d" == "abcd");

string 的接口比较复杂ÿ

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值