本文主要讲ruby中的字符串的创建以及使用方法,希望能帮助到正在学习ruby(http://www.maiziedu.com/course/ruby-px/)字符串的朋友。
字符串的创建:字符串也是一种对象,和其他一般的对象一样,能够使用new的方法来创建。
eg:
str = String.new
str << 72 << 101 << 108 << 108 << 111
p str #=> " Hello "
字符串字面量:将想创建的字符串写在一对(")或者(')内
eg:
"Hello"
"中文"
'single quoted'
'含有换行'
转义符:用双引号括起来的字符串同时也可以使用转义符,转义符用反斜线“\”加上特定的记号来表示。
eg: "\n" "\0"
公式的展开:在双引号表示的字符串字面量中可以进行公式的展开,但是在单引号表示的字符串中则不可以。所谓公式的展开是指在字符串中括在#{ ... }中的部分会被作为Ruby的公式来解释,它的值将被展示在字符串中。
eg:
a = 2
"a的值是#{ a }"
"a的5次方是#{ a ** 5 }"
反引号字符串:字符串如果用反引号(`)引用,就会成为一种特殊的字符串字面量。反引号中的内容将会作为shell命令被执行,命令的输出内容会被转换成字符串。
eg:
p `date`
p `pwd`
百分号记法:百分号记法中不使用反斜线来对引号字符进行转义,所以在表示包含很多引号的字符串时,减少了转义符的使用。
eg:
% q [其中含有"的字符串] #=>"
%Q[其中含有'的字符串] #=>'
正则表达式:正则表达式是字符串进行某种模式匹配的迷你程序语言。查找或替换字符串中具有特定模式的部分时,可以很简单的对模式加以表述。
正则表达式字面量:正则表达式(Regexp)对象由正则表达式字面量来创建。正则表达式字面量就是像/Regexp/这样用斜线括起来的表达式。另外,除了使用斜线以外,还可以使用百分号记法,像%r!regexp!这样来记述。而且正则表达式字面量中转义符公式展开也是可以使用的。参数!表示该正则表达式不区分字母大小写。
对字符串进行操作:
eg:
story = <<EOS
Solomon Grundy,
Born on Monday,
Christened on Tuseday,
Married on Wednesday,
Took ill on Thursday,
Worse on Friday,
Died on Saturday,
Buried on Sunday,
This is the end
Of Solomon Grundy.
EOS
#根据位置对字符进行操作
p story [ 0 ], story [ 1 ], story [ 2 ] #=>"S", "o", "l"
p story [ 187 ] #=>nil
#负的位置
p story [ -1 ], story [ -2 ], story [ -3 ], story [ -4 ] #=>"\n", ".", "y", "d"
p story [ 8, 6 ] #=>"Grundy" 用位置和长度进行操作
p story [ 8...14 ] #=>"Grundy" 用范围进行操作
p story [ "Monday" ] #=>"Monday" 用子字符串进行操作
p story [ /\w+sday/ ] #=>"Wednesday" 用正则表达式进行操作
更新:Ruby中字符串对象是可变的,所以字符串的内容也是可变的。
eg:
story [ "Solomon Grundy" ] = "Hippopotamus"
print story
#=>Hippopotamus
#Born on Monday,
#Christened on Tuseday,
#Married on Wednesday,
#Took ill on Thursday,
#Worse on Friday,
#Died on Saturday,
#Buried on Sunday,
#This is the end
#Of Solomon Grundy.
字符串操作:
eg1:连接
"str" + "ing" #=>"string"
str = "str"; str << "ing"
p str #=>"string" 破坏性的连接运算符<<
eg2:重复
"Look! " * 3 #=> "Look! Look! Look! "
eg3:分割:将一个字符串分解成多个字符串则可以使用split方法,在其参数中代入正则表达式,
"a, bb, ccc, dddd".split ( /,/ ) #=> ["a", " bb", " ccc", " dddd"]
"string".split( // ) #=> ["s", "t", "r", "i", "n", "g"]
eg4:其他
"string".reverse #=> "gnirts" 将字符串倒转的方法
"\n \rstring ".strip #=>"string" 删除字符串开头和结尾空白的方法
"string" . length #=>6 计算字符串长度
eg5:迭代:在字符串上进行反复操作的方法
"str" . each_byte do |byte|
p byte #=>115, 116, 114
end
story . each_line do |line|
print line
end
"String" . each_char do |char|
p char #=>"S", "t", "r", "i", "n", "g"
end
eg6:格式化
printf ( "%04d", 3 ) #=>"0003"4位数,前面以0补齐
printf( "%08.4f", Math::PI * 10 ) #=>"031.4159"
printf( "hex = %X, oct = %o", 10,10 ) #=>"hex = A, oct = 12"
String#%也具有相同的功能,而且用起来更简洁。
p "%04d" % 3
p "%08.4f" % (Math::PI * 10)
p "hex = %X, oct = %o" % [10, 10]
eg7:Encoding(编码)
"Hello" . encoding #=><Encoding:UTF-8>
Encoding . name_list #列出现在可以使用的编码方式
Encoding . find("CP1258") #得到Encoding编码对象
eg8:Magic Comment(魔法注释)
# -*- coding:utf-8 -*- 或 # vim:fileencoding = UTF-8
有了这样的注释,Ruby会将源代码以UTF-8的编码来看待,使用时将这样的注释添加到源代码的开头即可。
eg8:编码的更换:使用String#encode方法可以更换字符串的编码
# -*- coding:utf-8 -*-
utf = "中国"
p utf . encoding #=>#<Encoding:UTF-8>
sjis = utf . encode("Shift_JIS")
p sjis . encoding #=>#<Encoding:Shift_JIS>
字符串的比较:字符串只有在字节表相同并且编码方式也相同的情况下才相等。