Wednesday, October 15, 2008

(6)Ruby中的文本

Ruby通过String类对象来描述文本,Ruby为String定义了一些列非常有用的方法来操作文本:截取字符串,插入,替换,删除等等操作。提到字符串我第一个想到了正则表达式,Ruby提供了Regexp类对象来实现这一功能。比如:/[a-z]\d+/ 表示查找所有以小写字母开头后面跟1到多个数字的文本。值得一提的是Ruby1.9比起1.8提供了对Unicode和其他多字节文本的支持,我在后面的部分会予以介绍。
单引号字符
你可以使用单引号('')包含一段文本,单引号之间的内容就是字符串的值:
'This is a simple Ruby string literal'

那么如果我们的文本中本身就包含单引号怎么办呢?答案是使用反斜杠(\),Ruby解析器在遇到单引号前面有一个反斜杠的时候,不会认为这是一段字符串的终止,而且单引号之前的第一个反斜杠也会被忽略:

'Won\'t you read O\'Reilly\'s book?'


说一下面的例子中,如果你答应这个字符串,你只会看到一个反斜杠:
'This string literal ends with a single backslash: \\'

实际上如果一段文本中存在一个\而且其后跟有一个字符那么他总是被Ruby解析器忽略,比如下面的等式是成立的:
'a\b' == 'a\\b'

最后在来说话文本的换行,你知道,我们的文本有时候会很长,如果把它写在一行里,天哪,看起来多臭啊,利用反斜杠你就可以解决这个文本,下面的例子中Ruby会把反斜杠当作多个文本的链接,你最终得到的是一行文本而不是多行:
message =
'These three literals are '\
'concatenated into one by the interpreter. '\
'The resulting string contains no newlines.'

双引号文本
双引号文本提供了比单引号方式更好的功能,你可以用\n表示换行,\t表示制表符,\'表示文本中的一个单引号。
puts "\t\"这段文本以制表符开始以换行符号结束\"\n"
puts "\\" # 输出一个反斜杠

Ruby1.9中提供了\u 方式在双引号中描述一段Unicode文本,这里还有其他很多\开头的应用,随后我会给出一个列表来说明他们的用法。
Ruby字符串中另一的强大的功能是你可以在一个双引号字符串中嵌入任意的Ruby表达式。这种表达式以#开头,其后是一对{}你的表达式就包含在括号中。
"360 degrees=#{2*Math::PI} radians" # "弧度与角度的计算公式"
如果嵌入的表达式引用的是一个全局变量、实例变量或者类变量,通常{}是可以省略的,比如:

Created with colorer-take5 library. Type 'ruby'

$salutation = 'hello' # 定义一个全局变量
"#$salutation world" # 在双引号字符串中应用

一个特殊的情况下,比如你的字符串中包含#且其后出现{,$或者@,但是这又不是一个表达式,你当然不希望Ruby按表达式来解析它们,怎么办呢,方法是使用反斜杠,


Created with colorer-take5 library. Type 'ruby'

"My phone #: 555-1234" # 这种情况下没有文本
"Use \#{ to interpolate expressions" # 用反斜杠来告诉Ruby#{后面不是表达式

C语言程序员知道Ruby中支持sprintf和printf:
sprintf("pi is about %.4f", Math::PI) # Returns "pi is about 3.1416"
只有做的好处是你可以知道你的文本输出格式.
Ruby 还提供了另一种方式,使用%符号:

"pi is about %.4f" % Math::PI # 想过与上面的方式相同
"%s: %f" % ["pi", Math::PI] # 左边是参数,右边是一个数组包含了每个参数的值

双引号之间的字符可以直接换行,你可以使用一个反斜杠来连接字符:
print "This string literal
has two lines \
but is written on three"

打印结果是:
This string literal
has two lines but is written on three.
下列了所有反斜杠操作的含义:
  • \ x :它与的含义和x本身一样,x可以是任何字符,它的作用是告诉Ruby\后面的内容就是它自己,没有任何特殊含义,尤其是遇到某些特殊符号的时候。
  • \a:如果在控制台运行PC会发出Bi的一声。
  • \b:代表退格键
  • \e:代表Ese键
  • \f:换页符号
  • \n:换行符
  • \r:回车符号
  • \s:空格符号
  • \t:制表符号
  • \u nnnn:Unicode代码,一种n代表一个十六进制的代码。
  • \u{ hexdigits }:Unicode代码的特殊用法。
  • \v:垂直线符号
  • \ nnn:nnn代表八进制符号(000-377)
  • \ nn:nn代表八进制符号(00-77)
  • \ n:n代表八进制符号(0-7)
  • \x nn:nn是两个16进制符号(00-ff),注意这里的字母代表所有的大小写字母。
  • \x n::n是一个16进制符号(0-f),注意这里的字母代表所有的大小写字母。
  • \ eol:终止符号

No comments: