zuerrong 发表于 2010-12-09 16:32

ruby字串为王 [扫盲篇]

本帖最后由 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.chr
=> "h"

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

irb(main):010:0> s
=> "hell"

irb(main):011:0> s
=> "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 = "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

2gua 发表于 2010-12-09 16:35

好帖啊。:emn54:

2gua 发表于 2010-12-10 06:47

文本/字符/正则表达式的处理,是Ruby的强项。

ziyiu123 发表于 2011-02-22 19:18

:emn10:,好长啊。。。

gr33n 发表于 2011-11-17 23:08

好强啊。

gr33n 发表于 2012-02-03 18:58

String.instance_methods.sort

很实用啊。 啊。

Sevk 发表于 2012-02-05 17:06

李大双 发表于 2012-02-06 19:26

:wink::wink:

rubyish 发表于 2012-02-08 18:36

zuerrong 发表于 2010-12-09 12:32 static/image/common/back.gif
之所以说ruby字串为王,是因为ruby是我所见过的语言里,字串处理最为强大的。



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

2gua 发表于 2012-02-09 08:26

文字处理是程序处理的基础工作。
页: [1] 2
查看完整版本: ruby字串为王 [扫盲篇]