在Ruby中使用字符串
- 2.1表示普通字符串
- 2.2用替代符号表示字符串
- 2.3使用Here-Documents
- 2.4查找字符串的长度
- 2.5一次处理一行
- 2.6一次处理一个字符或字节
- 2.7执行特殊的字符串比较
- 2.8标记字符串
- 2.9格式化字符串
- 2.10使用字符串作为IO对象
- 2.11控制大小写
- 2.12访问和分配子字符串
- 2.13替换字符串
- 2.14搜索字符串
- 2.15字符与ASCII码的转换
- 2.16隐式和显式转换
- 2.17向String对象添加Item
- 2.18删除尾随换行符和其他字符
- 2.19从字符串中删除空白
- 2.20重复字符串
- 2.21在字符串中嵌入表达式
- 2.22字符串的延迟插值
- 2.23解析以逗号分隔的数据
- 2.24将字符串转换为数字(十进制和其他形式)
- 2.25编解码rot13 Text
- 2.26加密字符串
- 2.27压缩字符串
- 2.28对字符串中的字符计数
- 2.29反转字符串
- 2.30删除重复字符
- 2.31移除特定字符
- 2.32打印特殊字符
- 2.33生成连续字符串
- 2.34计算32位CRC
- 2.35计算字符串的SHA-256哈希值
- 2.36计算两个弦之间的Levenshtein距离
- 2.37 Base64字符串的编解码
- 2.38扩展和压缩制表符
- 2.39换行
- 2.40结论
- 原子一度被认为是构成自然的基本构件;当时人们认为质子是最基本的,然后是夸克。现在我们说弦是基本的。
- ——david Gross,普林斯顿大学理论物理学教授
20世纪80年代初,一位计算机科学教授以一个简单的问题开始了他的数据结构课。他没有自我介绍,也没有说明课程的名称;他没有发教学大纲,也没有给出教科书的名字。他走到全班同学面前问道:“最重要的数据类型是什么?”
有一两个猜测。有人猜是“指针”,他高兴起来,但说不,不是这个。然后他提出了自己的观点:最重要的数据类型是字符数据。
他说得有道理。计算机应该是我们的仆人,而不是主人,字符数据具有人类可读的特点。(有些人可以很容易地读取二进制数据,但我们将忽略它们。)字符(以及字符串)的存在使人与计算机之间的通信成为可能。我们能想到的每一种信息,包括自然语言文本,都可以用字符串编码。
一个字符串只是一个字符序列。与Ruby中的大多数实体一样,字符串是一等对象。在日常编程中,我们需要以多种方式操作字符串。我们想要连接字符串、标记它们、分析它们、执行搜索和替换等等。Ruby使大多数这些任务变得容易。
在Ruby历史的大部分时间里,单个字节被认为是一个字符。对于特殊字符、表情符号和大多数非拉丁文字来说,情况并非如此。有关字节和字符不同的更详细讨论,请参阅第4章“Ruby中的国际化”。
2.1表示普通字符串
Ruby中的字符串仅由一个8位字节序列组成。它不像C中那样以空结尾,所以它可能包含空字符。包含大于0xFF字节的字符串总是合法的,但只有在非ascii编码中才有意义。假定字符串使用UTF-8编码。在Ruby 2.0之前,它们被假定为简单的ASCII。(有关编码的更多信息,请参阅第4章。)
Ruby中最简单的字符串是单引号。这样的字符串完全按字面理解;唯一可识别的转义序列是单引号(\ ')和转义的反斜杠本身(\ \).下面是一些例子:
s1 = '这是一个字符串' #这是一个字符串s2 = 'Mrs. O'Leary ' # Mrs. O'Leary ' s3 = '查找C:\\TEMP' #查找C:\TEMP
双引号字符串更通用。它允许更多的转义序列,如退格、制表符、回车和换行。它允许将控制字符嵌入为八进制数,并通过十六进制引用数嵌入Unicode代码点。考虑一下这些例子:
s1 = "This is a tab: (\t)" s2 = "Some backspaces: xyz\b\b\b" s3 = "This is a tab: \011" s4 = "And these are both bells: \a \007" s5 = "This is the unicode snowman: \u2603"
非ascii字符在检查其字符串时将显示“反斜杠转义”,但将正常打印。双引号字符串还允许在其中嵌入表达式。参见第2.21节“在字符串中嵌入表达式”。