字符串类

字符串的创建

普通定义

str1 = "字符串1"

#注意,单引号里,转义符失效,字符串插值也不能用
str2 = '字符串2'

使用%Q和%q好处是,不用管""和''的转义

desc = %Q{Ruby的字符串中也可以使用''和""}
str = %q|Ruby said, 'hello, world!'|

使用Here Document

一般使用EOB (end of block)和EOF (end of file)定义

10.times do |i|
  print(<<"EOB")
i: #{i}
#注意,这一行,前面一定不能有缩进
EOB
end
10.times do |i|
  print(<<-"EOB")
i: #{i}
  #如果是用<<-定义的,结束标识符前面可以有缩进
  EOB
end
str = <<-EOB
Hello!
Hello!
Hello!
EOB

获取字符串长度

p "hello world".size
p "hello world".length

#字节数
p "hello world".bytesize

#判断长度为0
p "".empty?
p "hello world".empty?

字符串索引

str = "全新的String类对象"
p str[0]
p str[2, 8]

字符串连接

hello = "hello, "
world = "world!"
str = hello + world
p str
#=> "hello, world!
hello = "hello, "
world = "world!"

#hello.concat(world)
hello << world
p hello
#=> "hello, world!
#注意,这里貌似和hello = hello + world一样,实际不一样。这是创建新对象

p world
#=> "world!"

字符串分割

text = "hello:ruby:language"
p text.split(/:/)

换行符处理

删除最后一个字符 删除换行符
非破坏性 chop chomp
破坏性 chop! chomp!
str = "abcd"
newstr = str.chop
p newstr
#=> "abc"

newstr = str.chomp
p newstr
#=> "abcd"

str2 = "abcd\n"
newstr = str2.chop
p newstr
#=> "abcd"

newstr = str.chomp
p newstr
#=> "abcd"

处理文件,一般直接删掉换行符

f.each_line do |line|
    line.chomp!
    p line
end

指定换行符,windows小心

f.each_line("\r\n") do |line|
    line.chomp!
    p line
end

字符串检索与置换

#从左到右
str = "ABBBBBB"
p str.index("BB")
#=> 1

#从右到左
p str.rindex("BB")
#=> 5

#判断是否有指定字符串
p str.include?("BB")
#=> true

与索引操作相关的方法

s[n] = str s[n..m] = str s[n,len] = str

与数组操作一样

s.slice!(n) s.slice!(n..m) s.slice!(n, len)

通过索引删除字符串s的一部分,并返回删除的部分

使用Enumerator(计数器)对象的方法

调用each_line each_char each_type等,不带块,就会返回Enumerator对象。这样就能使用这个模块的方法了

str = "壹\n贰\n叁\n"

#collect等同于map,替换元素
tmp = str.each_line.collect do |line|
    line.chomp *3
end
p tmp
#=> ["壹壹壹", "贰贰贰", "叁叁叁"]

常用的字符串方法

s.delete(str) s.delete!(str)

从s字符串中删除字符串str

s = "防/止/检/索"
p s.delete("/")
#=> "防止检索"

s.reverse s.reverse!

反转字符串s。

s = "晚上好"
p s.reverse
#=> "好上晚"

s.strip s.strip!

删除开头和末尾空白字符的方法

p " Thank you. ".strip
#=> "Thank you."

s.upcase s.upcase! s.downcase s.downcase! s.swapcase s.swapcase! s.capitalize s.capitalize!

各种大小写转换

#全部大写
p "Hello World".upcase
#=> "HELLO WORLD"

#全部小写
p "Hello World".upcase
#=> "hello world"

#大转小,小转大
p "Hello World".upcase
#=> "hELLO wORLD"

#首字母大写,其他小写(段落)
p "Hello World".capitalize
#=> "Hello world"

s.tr s.tr!

替换字符

p "ABCDE".tr("B", "b")
#=> AbCDE

p "ABCDE".tr("BD", "bd")
#=> AbCdE

p "ABCDE".tr("A-E", "a-e")
#=> abcde

p "BACDE".tr("A-Z", "a-z")
#=> bacde

编码转换

encode encode!

# encoding: EUC-JP
euc_str = "日语EUC编码"
utf8_str = euc_str.encode("utf-8")