String 类
1)单引号和双引号。 单引号不会对里面的字符进行转义,类似于"\n”这样的转义会直接输出,也不能包含表达式。双引号则可以包含转议字符,也能包含表达式,表达式的格式为 #{xxxx}。需要注意的是,如果单引号里的字符串也包含单引号,还是要用“\'”进行转义的,这个转义是支持的。
=======================
a = "abc"
b = "1\n2\n3\n#{a}"
c = '1\n2\n3\n#{a}'
puts b #=> 1 2 3 abc
puts c #=> 1\n2\n3\n#{abc}
=======================
2) 新建字符串。
<1> 直接使用 ""和''生成字符串。
<2> 使用String.new()生成字符串。
<3> 使用%Q和%q。 如果字符串中包括""或''时,不想使用\"和\'频繁转义,可以使用%Q和%q来生成字符串。其中%Q相当于",%q相当于'。和%w一样,分界符可以用<> @@之类的。
=======================
%Q(1\n2\n3\n#{a}"5678"'9012')
%q<1\n2\n3\n#{a}'5678'"9012">
=======================
<4> 如果是多行文本,可以使用<<"xxx" 或 <<-"xxx"来实现多行。一般xxx多使用EOB或EOF,表示end of black和end of file。注意,如果是xxx可以用单引号或双引号引起来,分别代表单引和双引,也可以不带引号,默认代表双引。注意<<和xxx之间要连在一起,不要有空格。
======================
a = 123
s = <<-"EOB”
i : abc
j : #{a}
adang is me
EOB
print s #=> i : abc
j : 123
adang is me
======================
3) 字符串的长度。 字符串的长度可以用str.size或者str.length来获得。如果是英文字符,那么可以正常返回字符个数,但如果是非英文字符,比如说是中文字符,size返回的值就不正确了。因为ruby中返回的是字节数,不是字符数,这点和js不同。如果是中文,跟编码格式有关,如果是utf-8编码,那么一个中文占用三个字节,如果是ANSI编码,那么一个中文占用两个字节。为了解决这个问题,可以借助于正则表达式,换个思路获得字符串的字符长度。例如utf-8编码的,用str.split(//u).length,ANSI编码的,用str.split(//e).length。
=======================
utf-8编码
a = "我是个中文abc"
puts a.size #=> 18 (5X3+3 = 18)
puts a.split(//u).length #=> 8 (5+3 = 8)
ANSI编码
a = "我是个中文abc"
puts a.size #=> 13 (5X2+3 = 13)
puts a.split(//e).length #=> 8 (5+3 = 8)
=======================
4) empty? ruby中字符串提供了empty?方法判断是否为空。注意,如果有空格或者tab,都不算为空的。
=======================
a = ""
p a.empty? #=> true
a = " "
p a.empty? #=> false
=======================
5) split和unpack。 ruby中分割字符串有两种方法,一种是split,按特定字符分隔,另一种是unpack,按“字节”数分隔。unpack的参数格式是aXaX,“X”表示要截取的字节数。需要注意提,如果X+X的字符数不够整个字符串长度的话,字符串后面的字符就没了,如果超过总长度的话,会按最大数来截取,如果不确定最后一节的长度,可以使用a*来截取至结尾处的部分。
=======================
a = "1:2:3:4:5:6"
p a.split(":") #=>["1","2","3","4","5","6"]
p a.unpack("a2a3") #=>["1:","2:3"]
p a.unpack("a2a30") #=>["1:","2:3:4:5:6"]
p a.unpack("a2a3a*") #=>["1:","2:3","4:5:6"]
=======================
6) +,<<,和concat。 ruby中字符串的连接有三个方式。用+号可以新建一个字符串,用<<和concat可以修改原字串的值(不新建字符串)。因为<<和concat是修改址的方法,影响会比较大,切忌不要乱用。
=======================
a = "123"
b = "456"
p a + b #=> "123456"
p a #=> "123"
a = "123"
b = "456"
a << b
p a #=> "123"
a = "123"
b = "456"
a.concat(b)
p a #=> "123456"
=======================
7) chomp! 。 删除行尾换行符。 以gets等方法从标准输入读入字符串时,行尾会接着换行符,但实际在处理字符串时,换行符经常很碍事,因此,加上chomp!几乎是一种固定写法。
=======================
a = "123\n"
p a.size #=>4
a.chomp!
p a.size #=>3
while line = gets
line.chomp!
..
end
=======================
8) chop和chop!。 用于删除字符串的最后一个字符。