| 赞 | 13  | 
 
| VIP | 118 | 
 
| 好人卡 | 28 | 
 
| 积分 | 13 | 
 
| 经验 | 35779 | 
 
| 最后登录 | 2017-7-6 | 
 
| 在线时间 | 1564 小时 | 
 
 
 
 
 
Lv3.寻梦者 
	- 梦石
 - 0 
 
        - 星屑
 - 1305 
 
        - 在线时间
 - 1564 小时
 
        - 注册时间
 - 2008-7-30
 
        - 帖子
 - 4418
 
 
  
 
 | 
	
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员  
 
x
 
 本帖最后由 DeathKing 于 2010-12-12 11:11 编辑  
  我们的讲解是使用irb(Interactive Ruby)测试的。安装了Ruby解析器的读者可以,通过在运行处键入 irb 来启动irb。没有Ruby,试试TryRuby(1.9.2)吧:http://tryruby.org/     
  加粗的部分是要求读者在终端中键入的部分,而所有的Ruby注释和返回值都会以斜体显示。  
 
一、概述 
 
  Ruby具有强大的文本处理能力,这得益于标准库提供了很多字符处理的方法。而我们今天要讨论的就是Ruby中常用的字串处理得方法。 
 
  Ruby中的所有字串皆由String类生成。而String类的超类是Object。 
 
  字符(Character)是指计算机中使用的字母、数字、字和符号,通常是由一个字节表示(请于“宽字符”比较)。将字符看成一个元素,而字符串也就是这些元素构成的集合。 
 
 
 
二、通过反射了解String类 
 
  反射机制是我很喜欢的东西,大家也要学会使用它: 
  - irb(main):001:0> String.instance_methods.sort
 
 - => [:!, :!=, :!~, :%, :*, :+, :<, :<<, :<=, :<=>, :==, :===, :=~, :>, :>=, :[],:[]=, :__id__,     :__send__, :ascii_only?, :between?, :bytes, :bytesize, :capitalize, :capitalize!, :casecmp, :center, :chars, :chomp, :chomp!, :chop, :chop!, :chr, :class, :clear, :clone, :codepoints, :concat, :count, :crypt, :define_singleton_method, :delete, :delete!, :display, :downcase, :downcase!, :dump, :dup, :each_byte, :each_char, :each_codepoint, :each_line, :empty?, :encode, :encode!, :encoding, :end_with?, :enum_for, :eql?, :equal?, :extend, :force_encoding, :freeze, :frozen?, :gem, :getbyte, :gsub, :gsub!, :hash, :hex, :include?, :index, :insert, :inspect, :instance_eval, :instance_exec, :instance_of?, :instance_variable_defined?, :instance_variable_get, :instance_variable_set, :instance_variables, :intern, :is_a?, :kind_of?, :length, :lines, :ljust, :lstrip, :lstrip!, :match, :method, :methods, :next, :next!, :nil?, :object_id, :oct, :ord, :partition, :private_methods, :protected_methods, :public_method, :public_methods, :public_send,:replace, :respond_to?, :reverse, :reverse!, :rindex, :rjust, :rpartition, :rstrip, :rstrip!, :scan, :send, :setbyte, :singleton_methods, :size, :slice, :slice!, :split, :squeeze, :squeeze!, :start_with?, :strip, :strip!, :sub, :sub!, :succ, :succ!, :sum, :swapcase, :swapcase!, :taint, :tainted?, :tap, :to_c, :to_enum, :to_f, :to_i, :to_r, :to_s, :to_str, :to_sym, :tr, :tr!, :tr_s, :tr_s!, :trust, :unpack, :untaint, :untrust, :untrusted?, :upcase, :upcase!, :upto, :valid_encoding?]
 
  复制代码 
  有很多很多的方法,但我们不必要完全了解,我只会介绍一些非常常用的,和一些容易用到的方法。 
 
 
 
三、建立字符串 
 
  Ruby为我们提供了一个建立字符串的简便方法,使用""或''将字符集合,不过单引号和双引号也有一些区别。 
 
  单引号字符串会按照提供字串的方法保留字串,而双引号字串则会对一些表达式求值,比如控制符。下面是个很清楚的例子: 
 
        01.irb(main):004:0> puts "i am i\n\n" 
        02.i am i 
        03. 
        04.=> nil 
        05.irb(main):005:0> puts 'i am i\n\n' 
        06.i am i\n\n 
        07.=> nil 
 
  其中,\n是转义字符,代表换行符。puts是Kernel模块提供的方法,用于将对象输出到标准输出。在第一个输出中,双引号对\n进行了转义,输出为换行,而第二个输出,单引号没有对\n进行转义,直接输出到屏幕上。 
 
  注意! 
    事实上,Kernel类提供的四个输出方法(或许更多),puts、print、p、printf是有区别的,请读者查阅手册仔细区分,我们会在以后讨论。  
  如果你想让他更面向对象(Object Oriented),下面这个方式也不错: 
 
        i_am_a_str = String.new("Yes, you are!") 
 
  但是我要告诉你,字符串对象i_am_a_str仅是另一个字符串对象"Yes, you are!"的拷贝。(参考资料:ri String#new) 
 
  不过String也是Kernel的一个方法: 
 
        i_am_another_str = String("Err.....") 
 
  下面演示一种你在其他语言中很少(几乎不能)见到的建立字符串的方法,就像变魔术。 
 
        01.irb(main):004:0> str_a = %+this is a way+ 
        02.#=> "this is a way" 
        03.irb(main):005:0> str_b = %: any symbol : 
        04.#=> " any symbol " 
        05.irb(main):006:0> str_c = %Q(iamtheking\n) 
        06.#=> "iamtheking\\n" 
        07.irb(main):007:0> str_d = %q(iamtheking\n) 
        08.#=> "iamtheking\n" 
 
  %操作符再更上一对用于分界的字符,可以快速建立字符串。%++、%{}、%[]、%()、%!!什么的都可以! 
 
  %Q和%q就特殊一点,%Q表示建立双引号扩住的字符串,%q表示建立单引号扩住的字符串。注意单引号扩住的字符串不会进行转义。 
 
  Here文档(Here Document)和%x不在本次讨论范围之内。 
 
 
 
四、连接和访问字串 
 
  Ruby由C编写,继承了C良好的特性。两个字符串可以直接链接,就像C语言里面的那样: 
 
        "This is a "  "guide book" 
        #=> "This is a guide book" 
 
  觉得不习惯,+方法是个不错的选择,由String类提供。并且注意,如果引号是成对出现的,即使是单双引号混合链接也不会出错: 
 
        'Hi' + "\tevery\t" + 'one' + "\n" 
        #=> "Hi\tevery\tone\n" 
 
  当然,*方法更加欢欢乐乐,将"ha "字符串重复50次,笑得捧腹? 
 
        irb(main):009:0> "ha " * 50 
        #=> "ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha " 
 
  在C语言中,字符串是一个数组,在Ruby中,它的行为也像个数组,这得益于slice方法。 
 
        "take it easy"[0]                #=> "t" 访问字符串首字符 
        "DEETH"[2]="A"                   #=> "A" 将原字符串第三个字符替换为A 
 
        "OMG".slice(-1)                  #=> "G" 访问字符串末字符 
        "KIING".slice!(2)                #=> "I" 删掉原字符串的第三个元素 
 
  slice和slice!方法的效果因参数的不同而不同,对初学者来说不容易理解。而他们的别名方法,[]和[]=则简便、易读。故,推荐使用[]和[]=。 
 
  也可以这样访问: 
 
        "Like father like son"[0..3]         #=> "Like" 
        "Your master."["Your"]               #=> "Your" 
 
  []方法除了接受字符串和范围表达式,也支持正则式,同样,这里不讨论。 
 
 
 
五、字符串的比较 
 
        "I" == "I"                #=> true 
        "I" == "i"                #=> false 
        "U".eql? "U "             #=> false 
        "A" <=> "B"               #=> -1 
 
        ==方法当且仅当两个对象都为String,且内容也完全一致时,返回true。eql?方法和==方法类似,似乎在Ruby 1.8.6(RGSS)中,这两个方法有所区别。<=>被称为飞船操作符(Spaceship Operator),用来比较字符串的字符编码,返回-1(小于)、0(等于)或1(大于),当然,这个是区分大小写的。 
 
        "a" <=> "a"   #=> 0 
        "A" <=> "a"   #=> -1 
        "B" <=> "A"   #=> 1 
 
 
 
六、字符串的插入与修改部分字串 
 
        insert方法可以在指定位置插入字符串。 
 
        "I happy".insert(2, "am ")        #=> "I am happy" 
 
        替换部分字符串也可以用[]=方法。 
 
        "befor the day..."["befor"] = "before" 
        #=> "before" 
        #=> "before the day..." 
 
        # 当然也可以是范围表达式,而且不用担心长度不匹配        "befor the day..."[0..4] = "before" 
        #=> "before" 
        #=> "before the day..." 
 
        gsub和gsub!方法在平时也很常用。gsub方法的第一个参数要求提供想要被替换的字符串,而第二个参数则指出用于替换的字串。 
 
        "DeathQueen is here".gsub "Queen", "King" 
        #=> "DeathKing is here" 
 
 
 
七、分割字符串 
 
        split方法可以分割字符串,将其转变为数组。处理命令很方便。 
 
        "copy from des".split(" ") 
        #=> ["copy","from","des"]  
 
        split的参数指定了你要以什么字符串作为分割符,可以是字符串对象,也可以是正则表达式。 
 
未完……待编辑。 
 
 
 
 
 |   
 
 
 
 |