忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 14614 | 回复: 18

ruby字串为王 [扫盲篇] [复制链接]

论坛徽章:
0
发表于 2010-12-09 16:32 |显示全部楼层
本帖最后由 zuerrong 于 2010-12-09 16:33 编辑

之所以说ruby字串为王,是因为ruby是我所见过的语言里,字串处理最为强大的。

s = "hello"


创建一个字串。任何字串都是String类的实例,所以也可以这样创建:

s = String.new("hello")


字串可以用“<<”联合起来:

irb(main):005:0> s << " world"
=> "hello world"


当然可以串串烧:

irb(main):006:0> s << " welcome" << " to" << " ruby"
=> "hello world welcome to ruby"


字串跟数组一样,可以使用下标来访问:

irb(main):007:0> s = "hello world"
=> "hello world"

irb(main):009:0> s[0].chr
=> "h"


还可以使用类似于slice的方法:

irb(main):010:0> s[0..3]
=> "hell"

irb(main):011:0> s[0,3]
=> "hel"


在数组里讲过,这两者是不同的,前者的3表示位置终结数字,后者的3表示长度。

更胜一筹的是,可以直接取出字串:

irb(main):013:0> s["hello"]
=> "hello"


而子串称述更可以是正则表达式:

irb(main):014:0> s[/^\w+/]
=> "hello"


跟数组一样,字串也支持insert方法:

irb(main):022:0> s= "prety"
=> "prety"

irb(main):023:0> s.insert(-2,"t")
=> "pretty"


表示在-2的位置,插入一个"t"。

修改字串在ruby里是如此方便,直接像数组一样使用下标即可:

irb(main):024:0> s = "nice girl"
=> "nice girl"

irb(main):025:0> s[0,4] = "helo"
=> "helo"

irb(main):026:0> s
=> "helo girl"


除了下标还可以用正则表达式:

irb(main):032:0> s[/^\w+/] = "prety"
=> "prety"

irb(main):033:0> s
=> "prety girl"


字串的chop和chomp方法作用不同,前者删除最后一个字符,后者删除换行号:

irb(main):034:0> "hello".chop
=> "hell"

irb(main):035:0> "hello\n".chomp
=> "hello"


去除字串两边空格:

irb(main):076:0> " abc ".strip
=> "abc"


去除左边空格:

irb(main):077:0> " abc ".lstrip
=> "abc "


去除右边空格:

irb(main):078:0> " abc ".rstrip
=> " abc"


还可以使用delete方法删除字串里的字符:

irb(main):036:0> "hello".delete("l")
=> "heo"


最常用的字串操作方法包括gsub和scan,都支持正则表达式。

irb(main):037:0> s="hello world"
=> "hello world"

irb(main):038:0> s.gsub(/^\w+/,"kind")
=> "kind world"

irb(main):039:0> s.scan(/\w+/)
=> ["hello", "world"]


gsub执行子串替换,把匹配到的内容替换成第二个参数的内容。
scan执行字串查找,返回一个结果数组。

字串可以split成数组:

irb(main):044:0> s.split(//)
=> ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]


split同样支持正则表达式。

字串转换成整数或浮点:

irb(main):060:0> "123".to_i
=> 123

irb(main):061:0> "123".to_f
=> 123.0


each_byte可以遍历一个字串:

irb(main):047:0> "matz".each_byte { |b| puts b.chr }         
m
a
t
z
=> "matz"


顾名思义,downcase和upcase方法转换大小写:

irb(main):048:0> "I LOVE RUBY".downcase
=> "i love ruby"

irb(main):049:0> "I love Ruby".upcase
=> "I LOVE RUBY"


字串的长度:

irb(main):050:0> "hello".size
=> 5


字串还可以next:

irb(main):053:0> "x".next
=> "y"

irb(main):054:0> "xyz".next
=> "xza"


从a到z怎么遍历呢?很简单:

irb(main):055:0> "a".upto("z") do |s| print s end
abcdefghijklmnopqrstuvwxyz=> "a"


ruby最强大的字串处理,莫过于跟perl一样,内置正则表达式。

irb(main):070:0> s = "hello ruby world"
=> "hello ruby world"

irb(main):071:0> s =~ /ruby/
=> 6

irb(main):072:0> s =~ /Ruby/
=> nil


正则表达式执行后,返回的结果是匹配开始的位置,nil表示不匹配。
当然,在ruby世界里很多人反过来写:

irb(main):074:0> /ruby/ =~ s
=> 6


第一种写法表示字串目标支持=~方法,参数是正则表达式目标。
第二种写法表示正则表达式目标支持=~方法,参数是字串目标。
据说后者效率更高。

字串还有很多实用方法,运行如下语句看看:

irb(main):075:0> String.instance_methods.sort

论坛徽章:
0
发表于 2010-12-09 16:35 |显示全部楼层
好帖啊。

论坛徽章:
0
发表于 2010-12-10 06:47 |显示全部楼层
文本/字符/正则表达式的处理,是Ruby的强项。

论坛徽章:
0
发表于 2011-02-22 19:18 |显示全部楼层
,好长啊。。。

论坛徽章:
0
发表于 2011-11-17 23:08 |显示全部楼层
好强啊。

论坛徽章:
0
发表于 2012-02-03 18:58 |显示全部楼层
String.instance_methods.sort

很实用啊。 啊。

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
发表于 2012-02-05 17:06 |显示全部楼层

论坛徽章:
0
发表于 2012-02-06 19:26 |显示全部楼层
:wink::wink:

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2012-02-08 18:36 |显示全部楼层
zuerrong 发表于 2010-12-09 12:32
之所以说ruby字串为王,是因为ruby是我所见过的语言里,字串处理最为强大的。

字串,Array 都比 Perl 强大,简单,好用。我所见,too。

论坛徽章:
0
发表于 2012-02-09 08:26 |显示全部楼层
文字处理是程序处理的基础工作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP