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

ruby way之string之四

    博客分类:
  • ruby
阅读更多
31 删除指定的字符:
delete方法接受一个字符参数,然后从一个指定的字符串中删除这个字符(是删除所有的,而不只是第一个):
s1 = "To be, or not to be"

puts s2 = s1.delete("b")            # "To e, or not to e"

s3 = "Veni, vidi, vici!"

puts s4 = s3.delete(",!")           # "Veni vidi vici"
puts s5=s3.delete("b") #不存在b所以返回原字符串


32 打印出指定的字符:

dump方法,打印出字符串,并且转义所有的特殊字符(比如tab键转换为\t)
如果当$KCODE的设置为默认也就是n的话,也就是ASCII编码的话,inspect和dump方法是相同的:
s1 = "Listen" << 7 << 7 << 7   # Add three ASCII BEL characters
puts s1.dump                   # Prints: Listen\007\007\007
s2 = "abcdef\t\tghi\n\n"      
puts s2.dump                   # Prints: abc\t\tdef\tghi\n\n
puts s2.inspect                # Prints: abc\t\tdef\tghi\n\n
s3 = "Double quote: \""
puts s3.dump                   # Prints: Double quote: \"


33生成后续字符串

在一些罕见的情况下,我们可能需要得到一个"继承性"的字符串,比如从"aa 1"到"aa 2",等等等,这时我们可以使用succ方法:
droid="aa 1"     
puts droid.succ     #aa 2
pill="aa c"
puts pill.succ           # aa d


不推荐使用这个方法,除非字符串的值是可预计或者这样做是有原因的,如果你的字符串是一个很特殊的字符的话,你得到的结果将会令你十分惊讶(这个不知道他指什么字符,我试了下中文,和&,他们的话都会直接返回原字符串,而不会进行任何转变)

这里还有一个upto方法,这个方法,可以说是循环的调用succ方法。
"Files, A".upto "Files, X" do |letter|
  puts "Opening: #{letter}"
end
# Produces 24 lines of output


呵呵,这边还要提一下,我们虽然可以生成后续字符串,可是我们并不能生成前导字符串.

34 计算32位的CRC

CRC,也就是一种校验数据的规则,在ruby中,zlib库就是做这个的。

方法crc32计算出给定的参数字符串的CRC.

require 'zlib'
include Zlib
puts crc = crc32("Hello")             # 907060870
puts crc = crc32(" world!",crc)       # 3273993874
puts crc = crc32("Hello world!")      # 3273993874 (相同的字符串生成的校验码是一样的)


35计算一个字符串的MD5 hash.

这边介绍一下MD5了:
引用

md5的全称是message-digest algorithm 5(信息-摘要算法)
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

更具体的看这里:
http://baike.baidu.com/view/7636.html?wtp=tt

而ruby有一个扩展的类实现了md5算法,也就是MD5类。

MD5有两个类方法new和md5,都可以创建MD5对象,而且他们没有任何不同:
require 'md5'
hash = MD5.md5
hash = MD5.new

还有4个实例方法,clone,digest,hexdigest和update,clone方法简单的复制对象,update方法加一些信息到对象里面.
hash.update("More information...")

你也可以在创建对象的同时,加一些信息进去:
secret = MD5.new("Sensitive data")

重复调用update也就和调用一次,但是把重复调用所加入的信息一次行加入的效果一样:
hash.update("a") 
hash.update("b") 
#上面的也就等于下面的调用
hash.update("ab")

digest方法提供包含128位的摘要的16字节的二进制字符串
hexdigest方法是最有用的方法,他提供一个表示为32位的16进制字符的ascII码字符串(刚好是16字节,128位)
secret..hexdigest   #b30e77a94604b78bd7a7e64ad500f3c2
#下面的代码就是hexdigest的实现
def hexdigest
  ret = ''
  digest.each_byte {|i| ret << sprintf('%02x', i) }
  ret
end
secret.hexdigest  # b30e77a94604b78bd7a7e64ad500f3c2


因此你可以简单的得到MD5 hash
require 'md5'

puts m = MD5.new("Sensitive data").hexdigest


36 计算两个字符串之间的Levenshtein距离

这边有对 Levenshtein距离的介绍:
http://www.matrix67.com/blog/article.asp?id=382

简而言之就是计算两个字符串有多相似.他所计算的就是只使用 del(删除),ins(插入)和替换(sub)从一个字符串变为另一个字符串所需要的最小的步数, 而一个替换被看成一个删除和插入的组合操作.

下面的程序提供了几个可选的参数,你可以设置三种操作的权重.
class String

  def levenshtein(other, ins=2, del=2, sub=1)

    # ins, del, sub are weighted costs

    return nil if self.nil?

    return nil if other.nil?

    dm = []        # distance matrix
    # Initialize first row values

    dm[0] = (0..self.length).collect { |i| i * ins }

    fill = [0] * (self.length - 1)
    # Initialize first column values
    for i in 1..other.length
      dm[i] = [i * del, fill.flatten]
    end
    # populate matrix
    for i in 1..other.length
      for j in 1..self.length
    # critical comparison
        dm[i][j] = [
             dm[i-1][j-1] +
               (self[j-1] == other[i-1] ? 0 : sub),
                 dm[i][j-1] + ins,
             dm[i-1][j] + del
       ].min
      end
    end
    # The last value in matrix is the
    # Levenshtein distance between the strings
    dm[other.length][self.length]
  end
end
s1 = "ACUGAUGUGA"
s2 = "AUGGAA"
puts d1 = s1.levenshtein(s2)    # 9
s3 = "pennsylvania"
s4 = "pencilvaneya"
puts d2 = s3.levenshtein(s4)    # 7


ps:他这个算法写的,看的我头晕,还不如自己写个呢.

37 解码和编码base64的字符串

base64是我们经常用到的转换机器可读的到文本(除了一些特殊的字符):
使用base64的最简单的方法就是ruby内置的特性,Array类有一个pack方法能够返回一个base编码的字符串(传入参数"m")S,String类有一个unpack方法来对base64进行解码:
str="abcds"
puts newstr=[str].pack("m")
puts newstr.unpack("m")

这边注意,pack返回的是string,unpack返回的是array

38字符串的编码和解码(uuencode/uudecode)

先看下什么是uuencode和uudecoe吧:
引用
uuencode是将二进制文件转换为文本文件的过程,转换后的文件可以通过纯文本e-mail进行传输,在接收方对该文件进行uudecode,即将其转换为初始的二进制文件。
而uudecode就是将编码后的还原的.


str = "abcds"
puts new_string = [str].pack("u")         
puts original   =  new_string.unpack("u") 


这边也要注意,unpack返回的是array
39扩展和压缩制表符

这边作者可能由于,下一张才讲正则表达式,所以这边的方法比较麻烦.

40 包装文本行

我们经常需要去掉很长的文本行用我们自己选择的空白格式来打印他们:

str = <<-EOF
  When in the Course of human events it becomes necessary
  for one people to dissolve the political bands which have
  connected them with another, and to assume among the powers
  of the earth the separate and equal station to which the Laws
  of Nature and of Nature's God entitle them, a decent respect
  for the opinions of mankind requires that they should declare
  the causes which impel them to the separation.
EOF
max = 20
line = 0
out = [""]
input = str.gsub(/\n/," ")
words = input.split(" ")
while input != ""
  word = words.shift
  break if not word
  if out[line].length + word.length > max   #大于max的话就换到下一个元素
    out[line].squeeze!(" ")
    line += 1
    out[line] = ""
  end
  out[line] << word + " "        #将word添加到out[line]
end
out.each {|line| puts line}


下周开始正则表达式...



分享到:
评论

相关推荐

    The Ruby Way--3rd Edition--2015-英文版

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

    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 ...

    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(中文版)(第二版)pdf

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

    the-ruby-way

    the ruby way the ruby way

    the ruby way 2ed

    《The Ruby Way 2nd Edition》是一本深入探讨Ruby编程语言的经典著作,旨在帮助读者全面理解和掌握Ruby的精髓。这本书的第二版在2006年出版,由Addison-Wesley出版,作者通过深入浅出的方式,揭示了Ruby语言的强大...

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

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

    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以其简洁、优雅的语法和强大的元编程能力而备受赞誉...

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

    4. **国际化(I18N)与消息目录**:探讨了如何使用Ruby进行国际化支持,包括消息目录的创建和管理。 5. **高级数据结构操作**:除了基本的数据类型外,还涉及到了哈希表、数组以及其他数据结构如栈、树和图的操作。...

    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 ...

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

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

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

Global site tag (gtag.js) - Google Analytics