字符串处理

在结束字符串这个话题之前,我们将快速查看一看字符串的处理操作。

连接

string_concat.rb

你可以使用 <<+,或者说在中间放置一个空格来连接字符串。这里有三个字符串连接示例,在每一种情况下 s 都被赋值为字符串 “Hello World” :

  1. s = "Hello " << "world"
  2. s = "Hello " + "world"
  3. s = "Hello " "world"

但是请注意,当你使用 << 方法时,你可以直接附加一个整数(0到255),而不必先将它转换为字符串;当使用 + 或者空格时,整数必须使用 to_s 方法先转换为字符串。

关于逗号

你有时可能会看到 Ruby 代码使用逗号分割来分割字符串或者其它类型数据。在某些情况下,这些逗号似乎有连接字符串的效果。例如,下面的代码一眼看上去似乎是创建和显示了一个由三个子字符串加整数组成的字符串:

s4 = “This “, “is”, “ not a string!”, 10 print(“print (s4):”, s4, “\n”)

事实上,用逗号分割的列表是创建了一个数组——一个基于字符串的有序列表。string_concat.rb 程序包含的示例证明了这一点。

请注意,当你将一个数组传递给一个方法比如puts,数组中的每个元素将被单独处理。你可以像下面一样将x传递给puts

puts(x)

在这种情况下,输出将会是:

This is not a string! 10

我们将在下一章中更深入的研究数组。

字符串赋值

Ruby 的 String 类提供了许多有用的字符串处理方法。大多数的方法将会创建一个新的字符串对象。例如,在下面的代码中,第二行左侧的 s 与右侧的 s 不是同一个对象:

  1. s = "hello world"
  2. s = s + "!"
string_assign.rb

一些字符串方法实际上是在不创建新的字符串对象的情况下改变其本身。这些方法通常以感叹号结尾(例如,capitalize!)。

如果有疑问,可以使用 object_id 方法来检查对象。我已经在 string_assign.rb 程序中提供了几个不需要创建新字符串对象的操作示例。运行它们并且在字符串操作执行完之后检查 sobject_id

字符串索引

你可以将字符串视为一个字符数组,并使用方括号以及索引查找在该数组中特定索引处的字符。Ruby 中的字符串和数组索引是从 0 开始的。所以,要将字符串 s “Hello world” 中的 “e” 替换为 “a”,你应该在索引 1 处赋值一个新的字符:

  1. s[1] = 'a'

但是,如果你要在一个字符串中使用索引查找特定位置的字符,Ruby 不会返回这个字符本身,返回的是该字符的 ASCII 值:

  1. s = "Hello world"
  2. puts(s[1]) # prints out 101 – the ASCII value of 'e'

为了获得实际的字符,可以这么做:

  1. s = "Hello world"
  2. puts(s[1,1]) # prints out 'e'

这将告诉 Ruby 将字符串中索引 1 处的字符返回。如果你想要返回索引 1 处开始的3个字符,你可以输入:

  1. puts(s[1,3]) # prints "ell"

这告诉 Ruby 返回从索引 1 处开始接下来的3个字符。或者,你也可以使用双点符号 “范围(range)”来表示:

  1. puts(s[1..3]) # also prints "ell"
关于范围(Ranges),你可以参阅本章末尾的深入探索部分。

字符串还可以使用负值索引,在这种情况下,-1 代表最后一个字符的位置,并且可以再次指定要返回的字符数:

  1. puts(s[-1,1]) # prints 'd'
  2. puts(s[-5,1]) # prints 'w'
  3. puts(s[-5,5]) # prints "world"
string_index.rb

使用减号指定范围时,起始和终止索引必须均用负值:

  1. puts(s[-5..5]) # this prints an empty string!
  2. puts(s[-5..-1]) # prints "world"
string_methods.rb

最后,你可能需要尝试一些可用于操作字符串的标准方法。这些方法包括改变字符串大小写,反转字符串,插入子字符串,删除重复字符等等。我在 string_methods.rb 提供了几个示例。

删除换行符 chop 与 chomp

一些方便的字符串处理方法值得提及一下。chopchomp 方法可用于从字符串的末尾删除字符。chop 方法会返回一个字符串,这个字符串是删除最后一个字符得到的,但如果在字符串末尾处发现了回车符和换行符 “\r\n” 则删除一个回车符或换行符之后返回字符串。chomp 方法返回一个字符串,这个字符串是删除了末尾一个回车符或换行符得到的。

这些方法在你需要删除用户输入或者文件输入的换行符时是非常有用的。例如,当你使用 gets 方法读取一行文本时,它将返回该文本以及在末尾的“记录分隔符”,默认地通常是换行符。

记录分隔符- $/

Ruby 预定义了一个变量 $/ 来作为“记录分隔符”。这个变量被用于一些方法中,例如 getschomp 中。gets 方法读入一个字符串时将会包含一个记录分隔符。chomp 方法将会返回一个字符串,该字符串末尾存在记录分隔符时删除后返回,不存在时直接返回未修改的原始字符串。如果你愿意,可以重新定义记录分隔符,如下所示:

$/=”“ # the ““ character is now the record separator当你重新定义了记录分隔符之后,新的字符或字符串现在将会在一些方法中被使用,例如 getschomp 方法。例如: $/= “world” s = gets() # user enters “Had we but world enough and time…” puts(s) # displays “Had we but world”

你可以使用 chopchomp 方法来删除换行符。在大多数情况下,chomp 方法是最好的,因为它不会删除最后的字符,除非末尾是记录分隔符,而 chop 方法无论最后一个字符是什么都会删除。这里是一些示例:

chop_chomp.rb
  1. # Note: s1 includes a carriage return and linefeed
  2. s1 = "Hello world
  3. "
  4. s2 = "Hello world"
  5. s1.chop # returns "Hello world"
  6. s1.chomp # returns "Hello world"
  7. s2.chop # returns "Hello worl" – note the missing "d"!
  8. s2.chomp # returns "Hello world"

chomp 方法允许你指定要用做分隔符的字符或字符串:

  1. s2.chomp("rld") # returns "Hello wo"

格式化字符串

Ruby 提供了 v 方法来打印包含以百分号 % 开头的说明符的“格式化字符串”。格式化字符串之后可以是一个或多个用逗号分隔的数据项;数据项的列表应与格式说明符的类型相匹配。实际数据项替换字符串中匹配的说明符,并相应地进行格式化。这是一些常见的格式说明符:

  1. %d decimal number
  2. %f floating point number
  3. %o octal number
  4. %p inspect object
  5. %s string
  6. %x hexadecimal number

你可以通过在浮点数说明符 %f 前面放置一个点号来控制浮点精度。例如,这将显示两位浮点值:

  1. printf("%0.02f", 10.12945) # displays 10.13