赞 | 13 |
VIP | 118 |
好人卡 | 28 |
积分 | 12 |
经验 | 35779 |
最后登录 | 2017-7-6 |
在线时间 | 1564 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1170
- 在线时间
- 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的参数指定了你要以什么字符串作为分割符,可以是字符串对象,也可以是正则表达式。
未完……待编辑。
|
|