重定义字符串的比较
=================================
字符串的比较<,<=,>,>=其实是四个方法,他们都会调用<=>这个方法,我们可以
重新定义<=>来改变比较的行为:
class String
alias old_compare <=>
def <=>(other)
a = self.dup
b = other.dup
a.gsub!(/[\,\.\?\!\:\;]/, "")
b.gsub!(/[\,\.\?\!\:\;]/, "")
a.gsub!(/^(a |an |the )/i, "")
b.gsub!(/^(a |an |the )/i, "")
a.strip!
b.strip!
a.old_compare(b)
end
end
title1 = "Calling All Cars"
title2 = "The Call of the Wild"
# 未重定义之前,以下结果会是yes,但现在,将变成no
if title1 < title2
puts "yes"
else
puts "no"
end
但是,==不会调用<=>,因此,如果我们要定义特殊的“比较是否相等”,则我
们需要覆盖==这个方法。
切分字符串
===========================================================
默认的字符串切分符号是空格。
s1 = "It was a dark and stormy night."
words = s1.split # ["It", "was", "a", "dark", "and",
"stormy", "night"]
也可以指定切分符:
s2 = "apples, pears, and peaches"
list = s2.split(", ") # ["apples", "pears", "and peaches"]
s3 = "lions and tigers and bears"
zoo = s3.split(/ and /) # ["lions", "tigers", "bears"]
splite方法的第二个参数用来限制切分的返回结果个数,具体效果规则如下:
1.如果省略这个参数,则切分结果中末尾为null的结果将被压缩掉
2.如果是正数,则结果按照指定的限制数量进行切分,尾部的null结果也将会保
留做为结果
3.如果是负数,则切分结果数量无限制,并且保留尾部的null结果。
例如:
str = "alpha,beta,gamma,,"
list1 = str.split(",") # ["alpha","beta","gamma"]
list2 = str.split(",",2) # ["alpha", "beta,gamma,,"]
list3 = str.split(",",4) # ["alpha", "beta", "gamma", ","]
list4 = str.split(",",8) # ["alpha", "beta", "gamma", "", ""]
list5 = str.split(",",-1) # ["alpha", "beta", "gamma", "", ""]
格式化字符串
======================================================================
Ruby的字符串格式话沿用了C的格式,在C中可用于sprintf或printf的格式话字
符在Ruby中同样适用:
name = "Bob"
age = 28
str = sprintf("Hi, %s... I see you're %d years old.", name, age)
String类有个%方法,可以方面的做格式化的工作,它接受任何类型的单个值或
一个数组:
str = "%-20s %3d" % [name,age]
上面这个和下面这个式子是等效的
str = sprintf("%-20s %3d", name, age)
我们还可以使用ljust,rjust,center方法来格式化我们的字符串:
str = "Moby-Dick"
s1 = str.ljust(13) #"Moby-Dick "
s2 = str.center(13) #" Moby-Dick "
s3 = str.rjust(13) #" Moby-Dick"
控制字符串的大小写
==========================================
Ruby的String类提供了一组丰富的方法来控制大小写:
s = "Hello,World"
s1 = s.downcase #"hello,world"
s2 = s.upcase #"HELLO,WORLD"
capitalize方法把字符串第一个字符变大写,其余都是小写:
s3 = s.capitalize #"Hello,world"
swapcase则是把字符串中的每个字符的大小写转换一下(原来大写的都小写,反
之亦然):
s = "HELLO,world"
s1 = s.swapcase #"hello,WORLD"
这些方法都有相应的in-place方法
(upcase!,downcase!,capitalize!,swapcase!)
虽然,Ruby没有提供内置的判断字符是否是大小写的方法,但是,这不是问题,
我们可以通过正则表达式来完成这一点:
if string =~ /[a-z]/
puts "string contains lowercase charcters"
end
if string =~ /[A-Z]/
puts "string contains uppercase charcters"
end
if string =~ /[A-Z]/ and string =~ /a-z/
puts "string contains mixed case"
end
if string[0..0] =~ /[A-Z]/
puts "string starts with a capital letter"
end
字符串的子串
=============================================
Ruby提供了多种访问操作字符串子串的方式,我们可以来看一下:
1.如果给出一组数字,则第一个数字代表取字符串的偏移位置,第二个数字表示
取的长度:
str = "Humpty Dumpty"
sub1 = str[7,4] # "Dump"
sub2 = str[7,99] # "Dumpty" (超过的长度按实际长度来取)
sub3 = str[10,-4] # nil (长度为负数了)
记住,上面的形式,很多从别的语言转过来的ruby初学者会认为给出的两个数字
是子串的开始和结束位置的偏移,这是错误的,务必记住。
给出的偏移是负数也是可以的,这样,位置将从字符串末尾开始计算:
str1 = "Alice"
sub1 = str1[-3,3] # "ice"
str2 = "Through the Looking-Glass"
sub3 = str2[-13,4] # "Look"
我们也可以给出一个Range来取子串:
str = "Winston Churchill"
sub1 = str[8..13] # "Church"
sub2 = str[-4..-1] # "hill"
sub3 = str[-1..-4] # nil
sub4 = str[25..30] # nil
强大的是,正则表达式在这个时候也充分发挥着作用:
str = "Alistair Cooke"
sub1 = str[/l..t/] # "list"
sub2 = str[/s.*r/] # "stair"
sub3 = str[/foo/] # nil
如果给出的是一个字符串,则如果目标字符串中含有这个给出的字符串,则返回
这个给出的字符串,否则返回nil:
str = "theater"
sub1 = str["heat"] # "heat"
sub2 = str["eat"] # "eat"
sub3 = str["ate"] # "ate"
sub4 = str["beat"] # nil
sub5 = str["cheat"] # nil
如果给出的是一个数字,则返回的是该数字对应索引处字符的ASCII码:
str = "Aaron Burr"
ch1 = str[0] # 65
ch1 = str[1] # 97
ch3 = str[99] # nil
同样,我们不仅可以通过上面的方式访问子串,还可以来向字符串设置内容:
str1 = "Humpty Dumpty"
str1[7,4] = "Moriar" # "Humpty Moriarty"
str2 = "Alice"
str2[-3,3] = "exandra" # "Alexandra"
str3 = "Through the Looking-Glass"
str3[-13,13] = "Mirror" # "Through the Mirror"
str4 = "Winston Churchill"
str4[8..13] = "H" # "Winston Hill"
str5 = "Alistair Cooke"
str5[/e$/] ="ie Monster" # "Alistair Cookie Monster"
str6 = "theater"
str6["er"] = "re" # "theatre"
str7 = "Aaron Burr"
str7[0] = 66 # "Baron Burr"
未完...
分享到:
相关推荐
本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...
1.将2个字符串合并为新的字符串 2.扩展原有的字符串 1.index方法和rindex方法, index从左往右检查字符串是否存在,找到后返回首个字符串的索引
The Ruby Way(第2版) <br>The Ruby Way assumes that the reader is already familiar with the subject matter. Using many code samples it focuses on "how-to use Ruby" for specific applications, either ...
The Ruby Way 第三版(英文版),全书22章,书中包含600多个按主题分类的示例。每个示例都回答了“如何使用Ruby来完成”的问题。 ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!
《The Ruby Way 第二版》中文版采用“如何解决问题”的方式阐述Ruby编程,书中包含400多个按主题分类的示例。每个示例都回答了“如何使用Ruby来完成”的问题。首先对要完成的任务进行了描述,并讨论了技术方面的约束...
Stringex 一些实用的Ruby字符串扩展类
Ruby将字符串像数字一样处理.我们用单引号(‘…’)或双引号(…)将它们括起来. ruby> abc abc ruby> ‘abc’ abc 单引号和双引号在某些情况下有不同的作用.一个由双引号括起来的字符串允许字符由一个前置的斜杠...
最近有个需求,需要根据一个字符串当作一个类来使用,例如: 有一个字符串 “ChinaMag”,根据这个字符串调用 类 ChinaMag下的方法。 解决办法: 1.rails可以使用 constantize方法。 代码如下: pry(main)> ...
1.返回字符串的长度 代码如下: str.length => integer 2.判断字符串中是否包含另一个串 代码如下: str.include? other_str => true or false “hello”.include? “lo” #=> true “hello”.include? “ol” #=>...
GeoPattern - 从字符串创建漂亮的生成几何背景图像
Unicode字符串调试帮助
the ruby way 2ed. the ruby way 2ed.
在Ruby中的String对象持有和操纵的任意序列...反斜杠也可以转义另一个反斜杠,这样第二个反斜杠本身不是解释为转义字符。 以下是字符串相关的功能Ruby的。 表达式替换: 表达式替换嵌入任何Ruby表达式的值转换成字符串使
the ruby way the ruby way
内含以下4个文档: 1、Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm 2、O'Reilly.Learning.Ruby.May.2007.chm 3、Programming Ruby 2e.pdf 4、ruby中文文档.chm
Fuzzy-string-match是用于ruby的模糊字符串匹配库。 很快(用RubyInline用C编写) 它仅支持Jaro-Winkler距离算法。 该程序是从Lucene 3.0.2手动移植的。 (lucene是Java产品) 如果要添加其他字符串距离算法,...
主要介绍了Ruby中正则表达式对字符串的匹配和替换操作,包括对结果分组和一些特殊全局变量的介绍,需要的朋友可以参考下
11.5 时间日期the ruby way.rar
Ruby元编程第二版,中文影印版,便于英文不好的同学们学习