zoukankan      html  css  js  c++  java
  • 《Rubu基础教程第五版》第十四章笔记 字符串类

    字符串的创建可以通过""双引号或者''单引号进行创建

    双引号的可以通过#{}的方式取出变量名的内容,单引号不行,输入什么,输出就是什么

    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
    world
    "
    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)
    "
    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)
    65535用十六进制表示为&x
    => nil
    irb(main):048:0> printf("%d用十六进制表示为%x
    ",n,n)
    65535用十六进制表示为ffff
    => nil
    irb(main):050:0> p sprintf("%d用十六进制表示为%x
    ",n,n)
    "65535用十六进制表示为ffff
    "
    => "65535用十六进制表示为ffff
    "
    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
    "
    >> 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
    b
    c
    "
    => "a
    b
    c
    "
    >> 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
    

    6定义中文转阿拉伯数字,这个不写了

  • 相关阅读:
    USACO2.24 Party Lamps
    hdu3811 Permutation
    局部视图Partial
    动态修改a标签的css样式
    .net 记住用户名和密码
    C#枚举
    学习存储过程的时候参看的两个DVBBS的存储过程和两个初步了解后自己写的存储过程(带分页的)
    js 几种常用的表单输入判断
    AJAX+.net实现无刷新搜索,无须提交,边输边查
    ifream中的数据传递
  • 原文地址:https://www.cnblogs.com/sidianok/p/13055607.html
Copyright © 2011-2022 走看看