字符串的创建可以通过""双引号或者''单引号进行创建
双引号的可以通过#{}的方式取出变量名的内容,单引号不行,输入什么,输出就是什么
irb(main):016:0> desc = %Q(Ruby的字符串用''和"")
=> "Ruby的字符串用''和\"\""
irb(main):017:0> puts desc
Ruby的字符串用''和""
=> nil
irb(main):018:0> str = %q(Ruby的字符串用''和"")
=> "Ruby的字符串用''和\"\""
irb(main):019:0> puts str
Ruby的字符串用''和""
=> nil
irb(main):020:0> p str
"Ruby的字符串用''和\"\""
=> "Ruby的字符串用''和\"\""
irb(main):021:0> p desc
"Ruby的字符串用''和\"\""
=> "Ruby的字符串用''和\"\""
irb(main):022:0>
使用%q可以不用使用转义输出""或者''实际测试,q大写与小写没有区别
使用Here Document
Here Document来源与shell的一种程序写法,使用<<来创建字符串
标准版写法
<<"结束标识符"
字符串内容
结束标识符
结束标识符可以用""或者''。区别见前面,如果啥度没写,默认的效果等于""
使用EOF "End Of File"的缩写,或者EOB "End of Block"的缩写
Here Document的结束标识符一定要在行首
irb(main):022:0> 10.times do |i|
irb(main):023:1* print(<<"EOB")
irb(main):024:2" i:#{i}
irb(main):025:2" EOB
irb(main):026:1> end
i:0
i:1
i:2
i:3
i:4
i:5
i:6
i:7
i:8
i:9
=> 10
这样缩进不好看,可以通过<<-,这样程序会忽略结束标识符前的空格和制表符,结束标识符可以不在行首了
irb(main):027:0> 10.times do |i|
irb(main):028:1* print(<<-EOB)
irb(main):029:2" i: #{i}
irb(main):030:2" EOB
irb(main):031:1> end
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
=> 10
irb(main):032:0>
可以用<<~来忽略行首的空白,这样一来.i :#{i}也可以缩进了
irb(main):032:0> 10.times do |i|
irb(main):033:1* print(<<~EOB)
irb(main):034:2" i: #{i}
irb(main):035:2" EOB
irb(main):036:1> end
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
=> 10
还可以通过Here Document赋值给变量
irb(main):037:0> str = <<~EOB
irb(main):038:0" hello
irb(main):039:0" world
irb(main):040:0" EOB
=> "hello\nworld\n"
irb(main):041:0> puts str
hello
world
=> nil
irb(main):042:0>
sprintf等于format
脚本里面使用``来调用linux命令,这个跟shell脚本一样
irb(main):044:0> info = `who am i`
=> "sjz pts/105 2020-06-05 16:08 (172.168.131.111)\n"
irb(main):045:0> puts info
sjz pts/105 2020-06-05 16:08 (172.168.131.111)
=> nil
irb(main):046:0>
printf 与 sprontf方法
printf与C语言的操作的比较像
sprintf与Python中的format差不多
irb(main):046:0> n = 65535
=> 65535
irb(main):047:0> printf("%d用十六进制表示为&x\n",n,n)
65535用十六进制表示为&x
=> nil
irb(main):048:0> printf("%d用十六进制表示为%x\n",n,n)
65535用十六进制表示为ffff
=> nil
irb(main):050:0> p sprintf("%d用十六进制表示为%x\n",n,n)
"65535用十六进制表示为ffff\n"
=> "65535用十六进制表示为ffff\n"
irb(main):051:0>
sprintf与format使用一样
irb(main):051:0> p format("Hello, %s!","Ruby")
"Hello, Ruby!"
=> "Hello, Ruby!"
irb(main):052:0> format("Hello, %s!","Ruby")
=> "Hello, Ruby!"
irb(main):053:0>
标记、最小宽度、精度跟Python的print %格式化输出差不多
#b %B、%o、%x、%X,输出加上前缀后的结果(0b、0B、0、0x、0X)
书写的真的很烂,直接上一些代码,演示下算了
>> printf("%8s", "Ruby")
Ruby=> nil
>> printf("%8.8s", "Hello Ruby")
Hello Ru=> nil
>> printf("%#010x", 100)
0x00000064=> nil
>> printf("%#020x", 100)
0x000000000000000064=> nil
>> printf("%+ .2f", Math::PI)
+3.14=> nil
>> printf("%*.*f",5,2, Math::PI)
3.14=> nil
>>
获取字符串的长度
.length或.size获取字符长度 .bytesize获取字节长度,.empty?查寻是否为空
字符串的索引,跟列表操作一样
>> str = "Rubu is a good language"
=> "Rubu is a good language"
>> str[1..3]
=> "ubu"
>> str[2,3]
=> "bu "
>> str[1] = 15
Traceback (most recent call last):
5: from /usr/bin/irb:23:in `<main>'
4: from /usr/bin/irb:23:in `load'
3: from /Library/Ruby/Gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
2: from (irb):4
1: from (irb):4:in `[]='
TypeError (no implicit conversion of Integer into String)
>> str[1] = "15"
=> "15"
>> str
=> "R15bu is a good language"
>>
字符串的连接
合并一个新的字符用 +号,扩展原有的字符用<<用了+=叶可以,一般使用<<与cncat更加有效率
字符串的比较,如果直接比较是更具asci的大小进行比较的
字符串的分割
split 可以通过//的方式用正则来切
去换换行符,或者取出最后一个字符
shop与chon!去除最后一个字符
chomp与chomp去除最后一个换行符
>> a
=> "123\n"
>> a.chop
=> "123"
>> a.chomp
=> "123"
>> b = "123"
=> "123"
>> b.chop
=> "12"
>> b.chomp
=> "123"
>>
字符串的检索和替换
>> str = "shijianzhong"
=> "shijianzhong"
>> str.index("i")
=> 2
>> str.rindex("i")
=> 4
>> str.include?("jian")
=> true
>> [1,2,3].include?(2)
=> true
>>
字符串与数组的共同方法
与索引相关
取值用s[n],s[n..m],s[n, m]
与s.slice(n),s.slice(n..m),s.slice(n, m)相同的效果
slice!是删除字符的一部分,并返回删除的部分
返回Enumerator对象的方法
通过str.each_line, .each_char, .each_byte等可以返回一个Enumerator对象
>> str = "a\nb\nc\n"
=> "a\nb\nc\n"
>> tmp = str.each_line.collect do |line|
?> line.chomp! * 3
>> end
=> ["aaa", "bbb", "ccc"]
>>
>> str = "abcde"
=> "abcde"
>> tmp = str.each_byte.collect do |byte|
?> -byte
>> end
=> [-97, -98, -99, -100, -101]
>> tmp
=> [-97, -98, -99, -100, -101]
>>
与连接、反转相关的方法
s.concat(s2)
已经演示了
s.delete(str)
返回删除以后的字符
>> str = "I love you"
=> "I love you"
>> str.delete('love')
=> "I yu"
>> str
=> "I love you"
>> str.delete!('love')
=> "I yu"
>> str
=> "I yu"
>>
s.strip upcase downcase swapcase capitalize 字符串的一些方法
tr用于替换字符
>> str = "abcde"
=> "abcde"
>> str.tr("ab","c")
=> "cccde"
>>
把需要的字符转成成指定的字符
联系题
这个字符字符串切割并排序,Ruby is an object oriented programming language
str = "Ruby is an object oriented programming language"
str_array = str.split
p str_array
str_array.sort!{|a,b| a<=>b}
p str_array
3 不区分大小写进行排序
str = "Ruby is an object oriented programming language"
str_array = str.split
p str_array
str_array.sort!{|a,b| a.downcase<=>b.downcase}
p str_array
4把1的字符串的全部单词字符首字母变成大写
str = "Ruby is an object oriented programming language"
str_array = str.split
str_array = str_array.collect {|str| str.capitalize}
str = str_array.join(" ")
p str
5 ,统计1中的字符输出.
str = "Ruby is an object oriented programming language"
count = Hash.new(0)
str.each_char do |char|
count[char] += 1
end
count.each {|k,v|
puts "#{k}: " + "*" * v
}
# p count