`
simohayha
  • 浏览: 1409489 次
  • 性别: 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}


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



分享到:
评论

相关推荐

    ruby入门

    Ruby在很多方面与Perl、Python和Smalltalk有相似之处,但其语法更加简洁明了,特别适合初学者入门。 Ruby的核心特性包括: 1. 面向对象:Ruby的万物皆对象,就连基本的数据类型如整数、字符串和布尔值都是对象,...

    rfc822:可用于验证电子邮件地址的 Ruby gem,符合 RFC2822

    简介 这是 Ruby 的一个简单 gem,可简化验证电子邮件地址。 它符合 RFC2822。 这是一个快速的代码示例。 目前没有文档。 require 'rfc822'# To test if whole string is an email... ugly way# (returns 0 on ...

    麦芽糊精检验表格(食品企业原辅料质量验收记录表).docx

    麦芽糊精检验表格(食品企业原辅料质量验收记录表).docx

    塑料原型制作服务市场报告:全球前13强生产商排名及市场份额.docx

    塑料原型制作服务市场报告:全球前13强生产商排名及市场份额.docx

    C++数据结构与STL容器总结

    C++数据结构与STL容器总结

    谷氨酸钠(味精)检验表格(食品企业原辅料质量验收记录表).docx

    谷氨酸钠(味精)检验表格(食品企业原辅料质量验收记录表).docx

    小程序/虚拟资源变现知识付费小程序/激励广告流量主

    已更新微信登录获取用户头像失败功能,增加登录更新账号信息功能。 主要功能 会员系统,用户登录/注册 购买记录 收藏记录 基本设置 后台控制 导航颜色 字体颜色 标题等设置 流量主广告开关 小程序广告显示隐藏 广告主审核过审核 资源管理 后台可以添加5种类型资源 灵活设置 激励广告解锁资源 vip专享资源 免费资源 积分购买资源 阅读全文资源 公告 会员公告系统 VIP系统 用户可以开通VIP 查看vip专属资源 签到 签到互动二奖励 分类 资源分类 友情连接 跳转小程序 盈利能力:激励视频广告+插屏广告+视频广告+横幅广告+格子广告 =收益神器

    [继电保护仿真]-三段式距离保护 基于matlab simulink仿真 支持三段式电流保护、三段式距离保护、零序电流保护、欠压保护、振荡闭锁、差动保护、变压器差动保护、变压器后备保护、母线保护、

    [继电保护仿真]--三段式距离保护 基于matlab simulink仿真 支持三段式电流保护、三段式距离保护、零序电流保护、欠压保护、振荡闭锁、差动保护、变压器差动保护、变压器后备保护、母线保护、自动重合闸、分布式电源自适应保护等仿真定制 ,继电保护仿真; 三段式距离保护; MATLAB Simulink仿真; 多种保护类型仿真定制,Matlab Simulink三段式距离保护仿真定制

    基于Flask的pythonweb开发的外卖平台毕设

    内含数据库 源码 流程图 效果图,绝对物超所值

    薄板动力学相空间非传统Hamilton变分原理及辛算法的研究与应用(可复现,有问题请联系博主)

    内容概要:本文主要讨论了将弹性薄板动力分析从传统的Lagrange体系转换到Hamilton体系的必要性和优势。通过引入非传统Hamilton变分原理,建立了薄板动力学在相空间中的正则方程及对应的辛算法——辛空间有限元-时间子域法。这种方法不仅可以提高计算精度与效率,而且克服了以往非辛算法中存在的诸多缺陷。此外,文章提供了具体的数学模型、边界和初始条件推导以及算例验证。 适用人群:适用于固体力学领域研究人员、机械工程专业的学生和技术人员,特别是关注弹性薄板振动特性分析的专业人士。 使用场景及目标:本方法适用于弹性薄板结构在不同边界条件下的动态响应分析。旨在为相关工程问题提供更高精确度的解决方案。 其他说明:该研究展示了新型算法相比于传统方法在稳定性和准确性方面的优越性。通过对两个特定实例的数据对比进一步证实了辛算法的有效性和可行性。

    基于时变参数字典与精细化二次选择的正交匹配追踪算法在轴承故障诊断中的应用(可复现,有问题请联系博主)

    内容概要:本文提出了一种基于时变参数字典和细化二次选择机制的正交匹配追踪(TPRSS-OMP)算法,用于滚动轴承的早期故障检测。传统的相关滤波方法对噪声敏感,固定参数原子难以适应时间变化的影响特征,而本文提出的改进方法克服了这些问题。首先通过分段时域相关滤波与K-means聚类确定拉普拉斯小波字典的时间变化参数范围,在求解稀疏系数过程中引入新的优化后的次级选择原则——考虑信号重建前后信封频谱峰度的变化,从而提高算法对背景噪音干扰下的故障冲击特征提取能力。实验结果表明,新算法能有效重构故障信号并精准提取故障脉冲特征,适用于实际工况下的滚动轴承监测任务。 适合人群:具有一定机械工程与振动信号处理基础知识的研究人员、研究生、工程师。 使用场景及目标:①工业设备中滚动轴承及其他旋转设备的早期故障预警系统构建;②从强背景噪声中精确提取故障冲击特征。 其他说明:论文提供仿真及真实数据验证,展示了改进后的正交匹配追踪方法相比现有技术在准确性方面的优越表现,特别强调对于复杂操作环境下的鲁棒性能提升。文中还讨论了未来需要解决的问题如K-means聚类方法可能受到大幅波动的影响以及复合故障情况下的扩展性研

    醪糟检验表格(食品企业原辅料质量验收记录表).docx

    醪糟检验表格(食品企业原辅料质量验收记录表).docx

    SBLC买断基本信息.docx

    SBLC买断基本信息.docx

    罗汉果检验表格(食品香辛料质量验收记录表)检验表格(食品香辛料质量验收记录表).docx

    罗汉果检验表格(食品香辛料质量验收记录表)检验表格(食品香辛料质量验收记录表).docx

    MySQL 的.ibd文件恢复数据

    100%能恢复数据,亲测亲调试优化了代码 工具概述 我们有一个用Go语言编写的工具,能够读取.ibd文件并将其转换为可执行的SQL语句,从而实现数据恢复。该工具的主要功 解析.ibd文件:读取并解析.ibd文件中的数据结构。 生成SQL脚本:将解析到的数据转换为SQL插入语句。 恢复数据:通过执行生成的SQL脚本,将数据重新导入数据库 https://blog.csdn.net/qq_24396737/article/details/146182892?spm=1001.2014.3001.5501

    船舶与海洋工程技术-带顶滚轮的船用通用导缆器标准规范(ISO 13733:2020)

    内容概要:本国际标准 (ISO 13733:2020) 详细规定了安装在船舶上以引导系泊绳从船内到外板的带有顶部滚轮的船用通用导缆器的标准和技术要求。具体涵盖四种类型的导缆器分类、额定尺寸、尺寸参数、制造材料、结构设计、制造与检测要求以及标记要求等内容,并明确了安全工作载荷(SWL)的定义和要求,还提供了有限元法(FEM)用于评估强度的分析条件。 适用人群:适用于从事船舶工程、海上技术设备制造和相关标准规范实施的专业技术人员和监管人员。 使用场景及目标:本标准用于指导船舶装备制造商和工程师进行正确的导缆器设计、选型、生产及其安装施工,并保障在各种实际操作条件下能可靠传递系泊负荷。 其他说明:标准修订了多项内容,增加了技术指南并调整了关键部件的设计尺寸,提高了产品的安全性。此外,对于涉及专利权的技术细节,请参照ISO官网的相关信息获取进一步帮助。

    2025年汽车租赁业务系统应该具备的功能

    本文为抛砖引玉:简单描述,如需根据自身业务详细设计,请随时联系

    基于51单片机的测量仪(电压,电平,频率) 1104-基于51单片机的测量仪(电压,电平,频率)原理图、流程图、物料清单、仿真图、源代码 功能介绍: 基于单片机的简易测量仪(测量电压、TTL电平01

    基于51单片机的测量仪(电压,电平,频率) 1104-基于51单片机的测量仪(电压,电平,频率)原理图、流程图、物料清单、仿真图、源代码 功能介绍: 基于单片机的简易测量仪(测量电压、TTL电平01,频率等) 设计一个简易的测量设备,用两支表笔(1个是GND,一个是输入信号)测可用于数字电路实验及测试中 功能要求如下: (1)测量直流信号的电压,电压范围0~5V; (2)测量信号的TTL电平,给出高低电平测量结果;(3)测量数字信号的频率,给出测量结果; (4)用LCD显示结果,使用按键切测量功能(5)显示学号及姓名的拼音字母 有哪些资料: 1、仿真工程文件 2、源代码工程文件 3、原理图工程文件 4、流程图 5、功能介绍 6、元件清单 ,基于51单片机的测量仪;电压测量;电平测量;频率测量;原理图;流程图;物料清单;仿真图;LCD显示;按键切换功能;学号姓名显示。,基于51单片机多功能测量仪:电压、电平、频率测量及显示系统

    基于YOLOv9的智慧渔业捕捞检测系统(Python源码+数据集) 智慧渔业捕捞一共355张,类别为:'fish' ,基于YOLOv9; 智慧渔业捕捞检测系统; Python源码; 数据集; 鱼('

    基于YOLOv9的智慧渔业捕捞检测系统(Python源码+数据集) 智慧渔业捕捞一共355张,类别为:'fish' ,基于YOLOv9; 智慧渔业捕捞检测系统; Python源码; 数据集; 鱼('fish'); 355张图片,基于YOLOv9的渔业智慧检测系统(Python+数据集)

Global site tag (gtag.js) - Google Analytics