`
simohayha
  • 浏览: 1400334 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

ruby way之string之二

    博客分类:
  • ruby
阅读更多
接着昨天的。

11 控制字符串的大小写 。

downcase 方法可以转换一个字符串为小写,upcase可以转换一个字符串为大写.capitalize 方法强迫字符串第一个字符为大写,其他的字符为小写。
s1 = "Boston Tea Party"
puts s2 = s1.downcase             # "boston tea party"
puts s3 = s2.upcase 
puts s1.capitalize  #Boston tea party


swapcase 方法可以将一个字符串中的大小写进行翻转,而casecmp方法则是实现了和<=>相同的功能,只不过忽略了大小写.
puts s1.swapcase #bOSTON tEA pARTY
n4 = "ABC".casecmp("abc")  #0


我们还可以通过downcase!或者upcase!方法来判断一个字符串是否含有大写或者小写字母.
str="asdas"
str2="ASDF"
puts str.downcase! ==nil
puts str2.upcase! ==nil


12 得到和设置子字符串

在ruby中得到子字符串有很多不同的方法,经常使用的是中括号,中括号里面可以是数字,一个区间,一个正则表达式,或者一个string.
如果指定了一对数字的话,两个数字各代表偏移和长度:
str = "Humpty Dumpty"
puts sub1 = str[7,4]         # "Dump"
puts sub2 = str[7,99]        # "Dumpty" (长度超长也可以)
puts sub3 = str[10,-4]       # nil (长度是负数)

虽然长度不能是负数,可是这边我们的偏移可以是负数,如果是负数的话偏移是从字符串左边算起的,并且起始位置是-1而不是0.
str1 = "Alice"
puts sub1 = str1[-3,3]   # "ice"
puts str2 = "Through the Looking-Glass"
puts sub3 = str2[-13,4]  # "Look"


中括号里面也可以放区间,在这里区间也就是所要处理的string的起始位置和结束位置。区间的第一个数字可以为负数,可是第一个数字必须得比第二个数字小,如果不符合这个的话将会返回nil.
str = "Winston Churchill"
puts sub1 = str[8..13]    # "Church"
puts sub2 = str[-4..-1]   # "hill"
puts sub3 = str[-1..-4]   # nil
puts sub4 = str[25..30]   # nil


正则表达式也可以放.这个将会返回正则表达式所匹配的字符串.

str = "Alistair Cooke"
puts sub1 = str[/l..t/]   # "list"
puts sub2 = str[/s.*r/]   # "stair"
puts sub3 = str[/foo/]    # nil


一个string也可以放进中括号,如果它是所处理的string的子字符串的话,方法将会返回它自己,否则将返回nil
str = "theater"
puts sub1 = str["heat"]  # "heat"
puts sub2 = str["eat"]   # "eat"
puts sub3 = str["ate"]   # "ate"
puts sub4 = str["beat"]  # nil
puts sub5 = str["cheat"] # nil


最终,中括号里还可以放进一个数字,这个数字代表了从左往右第几个字符:
str = "Aaron Burr"
puts ch1 = str[0]     # A
puts ch1 = str[1]     # a
puts ch3 = str[99]    # nil


13 在一个string中进行替换.

我们可以使用sub或者gsub方法来进行替换,他们两个方法第一个参数都是接受正则表达式。其中,sub方法替换掉第一个匹配的地方,而gsub方法替换掉左右匹配的地方:
s1 = "spam, spam, and eggs"
s2 = s1.sub(/spam/,"bacon")               # "bacon, spam, and eggs"

s3 = s2.sub(/(\w+), (\w+),/,'\2, \1,')    # "spam, bacon, and eggs"

s4 = "Don't forget the spam."
s5 = s4.sub(/spam/) { |m| m.reverse }   
s5 = "alfalfa abracadabra"
s6 = s5.gsub(/a[bl]/,"xx")     # "xxfxxfa xxracadxxra"
s5.gsub(/[lfdbr]/) { |m| m.upcase + "-" }
# s5 is now "aL-F-aL-F-a aB-R-acaD-aB-R-a"


14 搜索一个字符串

index方法返回指定的子字符串,正则表达式或者字符的起始位置(如果有多个匹配的只返回第一个匹配的起始位置),没有发现的话返回nil:
str = "Albert Einstein"
puts pos1 = str.index(?E)        # 7
puts pos1 = str.index(69)        # 7
puts pos2 = str.index("bert")    # 2
puts pos3 = str.index(/in/)      # 8
puts pos4 = str.index(?e)        # nil
puts pos5 = str.index("bart")    # nil
puts pos6 = str.index(/wein/)    # nil


而rindex则是从string的右边(也就是结束处)开始查找,不过返回的值却是从左边数起的:
str = "Albert Einstein"
puts pos1 = str.rindex(?E)       # 7
puts pos2 = str.rindex("bert")   # 2
puts pos3 = str.rindex(/in/)     # 13 (finds rightmost match)
puts pos4 = str.rindex(?W)       # nil
puts pos5 = str.rindex("bart")   # nil
puts pos6 = str.rindex(/wein/)   # nil


而include?方法只是简单的返回是否指定的子字符串属于所处理的字符串.

str1 = "mathematics"
puts flag1 = str1.include? ?e         # true
puts flag2 = str1.include? "math"     # true
puts str2 = "Daylight Saving Time"
puts flag3 = str2.include? ?s         # false
puts flag4 = str2.include? "Savings"  # false


scan方法遍历一遍整个字符串查找出符合指定模式的字符串并组成一个数组或者将每次匹配的结果传递给block(注意,这边只是传递)
str1 = "abracadabra"
puts sub1 = str1.scan(/a./)
puts sub1 = str4.scan(/a./){|w| puts w} #ab ac ad 

看下面的代码:
str4 = "abracadabra"
sub1 = str4.scan(/a./){|w| w.upcase}
puts sub1

这边不仅没有转换为大写字母,而且直接把原始的字符串打印出来了,这边的原因就是我前面所提到的,如果是block形式的话,它仅仅只是把每次匹配的结果传递给block..

15一个字符和asc之间的转换。

我们可以使用<<符号或者chr来把一个asc转换为字符串:
puts  "a"<<111
puts  111.chr


而要将一个字符转换为一个asc码的话我们可以使用unpack方法:
puts  "E".unpack("c")#69

16 隐式转换和显式转换(也就是转换为字符串)

在ruby中,to_s和to_str让人很混淆.他们都是转换一个对象为string,可是他们有什么不同呢?

在ruby的核心类中基本都实现了to_s,而to_str却不是.
在这边to_s是显式转换,to_str是隐式转换,

to_s方法返回真正的string对象,而隐式转换则是一个强迫的转换,有点像java中的强制转型。

我们可以看下面的例子:
class Helium
  def to_s
    "He"
  end
  def to_str
    "helium"
  end
end

e = Helium.new
print "Element is "
puts e                    # Element is He
puts "Element is " + e    # Element is helium
puts "Element is #{e}"    # Element is He

这边的加号会将e强制转型为string因此会调用to_str,再看下面的代码
class Fixnum
  def to_str
    self.to_s
  end
end

puts str = "The number is " + 345     # The number is 345

这边会将345强制转型为string,因此就会调用to_str方法.

17字符串尾部添加元素.

我们能使用<<操作符.
str = "A"
str << [1,2,3].to_s << " " << (3.14).to_s
#如果一个数字在0..255 之间,将会把他转为一个字符
str = "Marlow"
str << 101 << ", Christopher"
# str is now "Marlowe, Christopher"

18 移除换行符和其他字符

chop方法将会删除最后一个字符,返回新的string。如果字符是以\r\n结束,则两个字符都会被删除.
str = "abcxyz"
s1 = str.chop           # "abcxy"
str2="abc\r\n"  
s2=str2.chop  #abc


而chomp方法则会默认删除回车换行符,如果有参数的话,将会删除参数所代表的字符串
str = "abcxyz"
puts s1 = str.chomp #abcxyz
str2 = "123\n"
puts s2=str2.chomp   #123
str1 = "abcxyz"
str2 = "abcxyz"
puts s1 = str1.chomp("yz")   # "abcx"
puts s2 = str2.chomp("x")    # "abcxyz"


19 删除空格符
strip将会删除掉字符串的开头和结尾的空格
sss="a d c "
puts sss.strip

如果你只想从字符串的开头或者结尾的空格,那么可以使用lstrip或者rstrip
str = "  abc  "
s2 = str.lstrip       # "abc  "
s3 = str.rstrip       # "  abc"


20 重复字符串

我们可以使用*来操作重复字符串:
puts etc = "Etc. "*3 # "Etc. Etc. Etc. "













分享到:
评论
1 楼 hexawing 2011-08-09  
而gsub方法替换掉左右匹配的地方
看了半天,应该是“所有”匹配的地方而不是“左右”吧?

相关推荐

    The Ruby Way(第2版)

    The Ruby Way(第2版) &lt;br&gt;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--3rd Edition--2015-英文版

    The Ruby Way 第三版(英文版),全书22章,书中包含600多个按主题分类的示例。每个示例都回答了“如何使用Ruby来完成”的问题。 ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!

    THE RUBY WAY(中文版)(第二版)pdf

    《The Ruby Way 第二版》...“《The Ruby Way (第2版)中文版》在阐述元编程(metaprogramming)等方面尤其出类拔萃,而元编程是Ruby最引人注目的方面之一。” ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!

    the ruby way 2ed

    这本书的第二版在2006年出版,由Addison-Wesley出版,作者通过深入浅出的方式,揭示了Ruby语言的强大功能和优雅特性。 Ruby是一种动态类型、面向对象的编程语言,它的设计理念是注重简洁和生产力,让开发者能够更...

    ruby学习资源(Programming Ruby, Learning Ruby, 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

    the-ruby-way

    the ruby way the ruby way

    深入体会Ruby的String类型有哪些强项

    总结来说,Ruby 的 String 类型强大之处在于它的可变性以及对性能的优化。通过内部结构的巧妙设计,Ruby 能够在保持字符串操作便捷的同时,有效地管理和利用内存,减少了不必要的内存分配和复制。这使得在处理字符串...

    Addison Wesley The Ruby Way 2Nd Edition Oct 2006.pdf(英文版)

    ### Addison Wesley《The Ruby Way》第二版(2006年10月) #### 书籍概览 《The Ruby Way》是由Hal Fulton编写的关于Ruby编程语言的经典著作,该书的第二版出版于2006年10月,由Addison Wesley Professional出版社...

    the ruby way

    《The Ruby Way》是一本备受推崇的Ruby编程教程,它以独特的方式深入浅出地介绍了Ruby语言。这本书的核心理念是“如何解决问题”,作者通过实际的编程示例和问题解决策略,帮助读者理解Ruby的强大功能和优雅语法。 ...

    11.5 时间日期the ruby way.rar

    "11.5 时间日期the ruby way"这个主题深入探讨了Ruby中处理时间日期的最佳实践和常见用法。让我们逐一了解这些知识点。 首先,`Time.now`是Ruby中获取当前时间的标准方法。它返回一个`Time`对象,表示自1970年1月1...

    Ruby-Way.rar_About Language

    《Ruby Way》是由Hal Fulton编写的关于Ruby编程语言的一本著作。这本书深入浅出地探讨了Ruby语言的各种特性,旨在帮助读者理解并掌握这门强大的动态脚本语言。Ruby以其简洁、优雅的语法和强大的元编程能力而备受赞誉...

    Ruby-BitString:Ruby 的 BitString gem

    BitString 是一个 Ruby 类,用于以类似“数组”的方式提供对位列表的访问。 直接寻址、分段、屏蔽等。 特征: Array 类的许多功能可用于 BitString。 问题: 未知,但请查看 GitHub 项目。 概要: require('bit...

    ruby-string-calculate:扩展Ruby的String类以计算简单的数学表达式

    将calculate方法添加到Ruby String类。 该方法可以执行以下数学运算: 添加 减法 乘法 分配 例子: "1 + 2".calculate # =&gt; 3 "9 - 2".calculate # =&gt; 7 "5 * 2".calculate # =&gt; 10 "15 / 3".calculate # =&gt; 5 ...

    Ruby.Programming_向Ruby之父学程序设计(第2版)

    《Ruby Programming:向Ruby之父学程序设计(第2版)》是为了让完全没有程序设计经验的读者也能灵活地使用Ruby,因此书中详细地说明了各种知识。从程序所需要的变量、常数、方法、类、控制结构等语法的说明,到类的主要...

    Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm

    《The Ruby Way》第二版是Addison-Wesley出版社在2006年推出的一本深入浅出的Ruby编程语言教程。这本书专为初学者设计,旨在帮助读者快速掌握Ruby语言的基础和高级特性,从而轻松入门Ruby编程。Ruby是一种动态、开放...

Global site tag (gtag.js) - Google Analytics