- 浏览: 251816 次
- 性别:
- 来自: 内蒙古
文章分类
- 全部博客 (237)
- Android 功能实现 (31)
- sql数据库的学习 (8)
- Android 美化界面 (2)
- Android 优化 (1)
- Ruby on Rails 方面 (45)
- git 方面的学习 (1)
- ruby 编程的琢磨 (13)
- linux下工具软件 (13)
- 操作系统的学习 (40)
- 非技术 (13)
- 网站开发 (18)
- js 学习笔记 (19)
- css学习 (5)
- 回顾总结 (2)
- Delphi 学习 (2)
- C 语言学习笔记 (1)
- 数据结构 (1)
- node js 学习 (6)
- 设计模式 (2)
- mongdb 学习笔记 (0)
- 软件服务 (3)
- osx系统 (4)
- 搜索引擎 (1)
- 测试工具 (1)
- Aliyun (1)
- 前端JS (1)
- python学习 (0)
- iOS系统 (1)
- 分布式锁 (1)
- 开发工具 (0)
- java代码 (2)
- java (1)
最新评论
-
jiguanghover:
写的不错,收藏一下
Ubuntu下RVM, Ruby, rails安装详细 和 卸载 -
maoghj:
回顾总结(二) -
yun2223:
对楼主表示感谢
Android控件开发之Gallery3D效果 -
zw_lovec:
说清楚点吧 亲 加点注释
out of memory -
lzyfn123:
http://www.iteye.com/images/smi ...
ruby-string 字符串的学习
String
来自:http://www.kuqin.com/rubycndocument/man/built-in-class/class_object_string.html
字符串类。可处理任意长度的字节串。
在该类的众多方法中,那些方法名尾部是!的方法将会直接修改字符串的内容。此时,使用不带!的同名方法是比较安全的。例如,在下例中就会出现这样的问题。
def foo(arg) arg.sub!(/good/, 'bad') arg end s = 'verygoodname' p foo(s) # => 'verybadname' p s # => 'verybadname'
为了正确处理日语字符串,还必须根据字符的编码情况来设定内部变量$KCODE 的值。String类将自身当作字节串来处理。例如,不管str的内容是什么,str[1]都会返回第2字节的字符代码。若想以字符(而非字节)为单位来处理日语字符串的话,请使用jcode.rb 。
超类:
包含的模块:
- Comparable
- Enumerable
类方法:
String.new(string
)
生成并返回一个与string 内容完全相同的新字符串。
ruby 1.7 特性 :省略参数时将生成并返回一个空字符串。
方法:
self
+ other
将字符串连接起来之后,返回得到的新字符串。
例:
p 'abc' + 'def' #=> 'abcdef'
self
* times
将字符串的内容重复times 次之后,返回新字符串。
例:
p "abc" * 4 #=> "abcabcabcabc"
self
% args
字符串的格式化。按照格式化字符串(self)的要求对参数进行格式化之后将其返回。
若args 是数组,则等同于
sprintf(self, *args)
除此之外,则等同于
sprintf(self, args)
详情请参考sprintf格式化 。
p "%#x" % 10 # => "0xa" p "%#x,%#o" % [10, 10] # => "0xa,012"
self
== other
self
> other
self
>= other
self
< other
self
<= other
字符串的比较。若变量$= 的值为真,则比较时会忽略字符大小写的区别。($=变量将被废弃。请参考obsolete )
self
<< other
concat(other
)
将other 字符串的内容连接到self之后。若other 是0到255之间的Fixnum 时,将把它的1个字节添加到末尾。
返回self
。
self
=~ other
与正则表达式other 进行匹配操作。若匹配成功则返回匹配位置的索引,若失败则返回nil。
与匹配相关的信息被存入内部变量$~ 中。
若other 既非正则表达式又非字符串时,将作如下处理
other =~ self
ruby 1.8 特性 : 在以前的版本中,若other 是字符串的话,就把它编译为正则表达式,然后与self进行匹配操作。在1.8以后的版本中,若将other 设为字符串时,会引发TypeError 异常。
~ self
ruby 1.8 特性 : 该方法已被删除。请使用Regexp#~ 即可替代该方法。
将self
编译为正则表达式,然后与内部变量$_
进行匹配操作,并返回匹配成功的位置的索引。这与$_ =~ Regexp.compile(self)
是一样的。
若$_
不是字符串就返回nil
。
ruby 1.7 特性 : 该方法等同于
$_ =~ Regexp.compile(Regexp.quote(self))
self[nth]
以整数形式(字符代码)返回第nth 字节的内容(相反地,若想从字符代码变为字符串时,请使用Integer#chr )。若nth 为负值,则从字符串尾部算起。
若nth
超出范围则返回nil
。
例:
p 'bar'[2] # => 114 p 'bar'[2] == ?r # => true p 'bar'[-1] # => 114 p 'bar'[3] # => nil p 'bar'[-4] # => nil
self[nth, len
]
返回从第nth 字节算起的长度为len 字节的子字符串。若nth 为负数则从字符串尾部算起。
若nth
超出范围则返回nil
。
self[substr]
若self
当中包含substr
,则生成并返回一致的字符串。若不包含substr
的话,就返回nil
。
substr = "bar" result = "foobar"[substr] p result # => "bar" p substr.equal? result # => true (ruby 1.7 特性:1.7.2 以后为 false)
self[regexp]
self[regexp, nth
] ((<ruby
1
.7
特性
>))
返回最初那个与regexp 相匹配的子字符串。与匹配操作相关的信息被存入内部变量$~ 中。
若与regexp
的匹配失败则返回nil
。
p "foobar"[/bar/] # => "bar" p $~.begin(0) # => 3
ruby 1.7 特性
:若使用了nth
参数,则返回最初那个与regexp
中第nth
个括号相匹配的子字符串。若nth
为0,则返回整个匹配的字符串。若匹配失败或没有与nth
相对应的括号时,返回nil
。
p "foobar"[/bar/] # => "bar" p $~.begin(0) # => 3 p "def getcnt(line)"[ /def\s*(\w+)/, 1 ] # => "getcnt"
self[first..last]
生成并返回一个包含从索引first 到索引last 之间所有内容的字符串。
. 0 1 2 3 4 5 (索引) -6 -5 -4 -3 -2 -1 (负的索引) | a | b | c | d | e | f | |<--------->| 'abcdef'[0..2] # => 'abc' |<----->| 'abcdef'[4..5] # => 'ef' |<--------->| 'abcdef'[2..4] # => 'cde'
当last 超过字符串长度时,就认为它的值等于(字符串长度-1)。
当first
小于0或大于字符串长度,或者first > last + 1
时返回nil
。但是,若first
和last
中的一个或者两个都为负数时,将会补足字符串的长度然后再次执行。
例:
'abcd'[ 2 .. 1] # => "" 'abcd'[ 2 .. 2] # => "c" 'abcd'[ 2 .. 3] # => "cd" 'abcd'[ 2 .. 4] # => "cd" 'abcd'[ 2 .. -1] # => "cd" # str[f..-1] 是一种惯用写法,它表示 'abcd'[ 2 .. -2] # => "c" # “从第f个字符开始到该字符串的最后” 'abcd'[ 1 .. 2] # => "bc" 'abcd'[ 2 .. 2] # => "c" 'abcd'[ 3 .. 2] # => "" 'abcd'[ 4 .. 2] # => nil 'abcd'[-3 .. 2] # => "bc" 'abcd'[-4 .. 2] # => "abc" 'abcd'[-5 .. 2] # => nil
self[first...last]
将字符串的头部看作第0个缝隙,将字符串的末尾看作第self.length个缝隙,然后生成并返回一个包含从第first 个缝隙到第last 个缝隙之间的所有内容的字符串。
字符串和“缝隙”的示意图 0 1 2 3 4 5 6 (缝隙编号) -6 -5 -4 -3 -2 -1 (负的缝隙编号) | a | b | c | d | e | f | |<--------->| 'abcdef'[0...3] # => 'abc' |<----->| 'abcdef'[4...6] # => 'ef' |<--------->| 'abcdef'[2...5] # => 'cde'
当last 大于字符串长度时,就认为它的值等于字符串的长度。
当first
小于0或大于字符串长度,或者first > last
时返回nil
。但是,若first
和last
中的一个或者两个都为负数时,将会补足字符串的长度然后再次执行。
例:
'abcd'[ 2 ... 3] # => "c" 'abcd'[ 2 ... 4] # => "cd" 'abcd'[ 2 ... 5] # => "cd" 'abcd'[ 1 ... 2] # => "b" 'abcd'[ 2 ... 2] # => "" 'abcd'[ 3 ... 2] # => nil 'abcd'[-3 ... 2] # => "b" 'abcd'[-4 ... 2] # => "ab" 'abcd'[-5 ... 2] # => nil
self[nth]=val
以val 来替换第nth 字节的内容。若val 是0到255之间的整数时,就把它看作是字符代码,并以该代码所对应的字符来进行替换操作。
返回val 。
self[nth, len
]=val
以val 来替换从第nth 字节起长度为len 字节的子字符串。若nth 为负数则从尾部算起。
返回val 。
self[substr]=val
以val 来替换字符串中第一个与substr 相对应的子字符串。
若self
中不包含substr
时,将引发IndexError
异常。
返回val 。
self[regexp]=val
self[regexp, nth
]=val
((<ruby
1
.7
特性
>))
以val 来替换第一个与正则表达式regexp 相匹配的子字符串。
若正则表达式的匹配失败则引发IndexError 异常。
返回val 。
ruby 1.7 特性 : 若使用了参数nth 时,则以val 替换第一个与正则表达式regexp 中的第nth 个括号相匹配的子字符串。若nth 为0时,则以val 来替换整个匹配部分。
若正则表达式匹配失败或没有与nth 相对应的括号时,将引发IndexError 异常。
self[first..last]=val
self[first...last]=val
以val 来替换从first 到last 之间的内容。
返回val 。
self
<=> other
以ASCII代码的顺序来比较self
和other
。若self
较大时返回正整数,相等时返回0,较小时返回负整数。
若常数$= 的值为真,则在比较的过程中忽略字母的大小写差别。($=变量将被废弃,请参考obsolete )
ruby 1.8 特性 :
当other
不是字符串时,若定义了other
.to_str以及other
.<=>的话,就返回0 - (other <=> self)
的结果。否则返回nil。
capitalize
capitalize!
将首字符(若为字母的话)改为大写字母,其余的改为小写字母。
capitalize
生成并返回修改后的字符串。而capitalize!
会修改self
本身并返回结果,若未作修改时返回nil。
p "foobar".capitalize # => "Foobar"
若未正确设置$KCODE
的话,部分汉字代码也会被篡改(在ShiftJIS编码下会发生这种情况)。相反地,即使设定了$KCODE
也不会对多字节字符的字母进行处理。
# -*- Coding: shift_jis -*- $KCODE ='n' puts "帰".capitalize # => 蟻
casecmp(other
) ((<ruby
1
.7
特性
>))
该方法与String#<=> 一样,是用来比较字符串的顺序的。 它将忽略字母的大小写。
该方法的运作不受$= 的影响。
p 'a' <=> 'A' #=> 1 p 'a'.casecmp('A') #=> 0
center(width
)
ljust(width
)
rjust(width
)
center(width
[, padding
]) ((<ruby
1
.8
特性
>))
ljust(width
[, padding
]) ((<ruby
1
.8
特性
>))
rjust(width
[, padding
]) ((<ruby
1
.8
特性
>))
分别返回居中、靠左、靠右的字符串。
p "foo".center(10) # => " foo " p "foo".ljust(10) # => "foo " p "foo".rjust(10) # => " foo"
当字符串长度超过width 时,将返回原字符串的拷贝。
s = "foo" p s.center(1).id == s.id # => false
ruby 1.8 特性 : 若使用了第二参数padding 的话,将使用padding 来填充空白。
p "foo".center(10,"*") # => "***foo****" p "foo".ljust(10,"*") # => "foo*******" p "foo".rjust(10,"*") # => "*******foo"
chomp([rs
])
chomp!([rs
])
删除字符串尾部的行切分符,该切分符由rs 指定。rs 的默认值取自变量$/ 的值。
若rs
的取值是nil
的话,将不作任何动作。若rs
是空字符串(段落模式)的话,将删除字符串尾部的所有的连续换行符。
chomp
生成并返回修改后的字符串。而chomp!
会修改self
本身并返回结果,若没作修改时返回nil。
ruby 1.7 特性 : 当rs 的值为"\n"(默认值)时,将会把"\r"、"\r\n"和"\n"全部看作行切分符并加以删除。
p "foo\r".chomp # => "foo" p "foo\r\n".chomp # => "foo" p "foo\n".chomp # => "foo" p "foo\n\r".chomp # => "foo\n"
chop
chop!
删除字符串末尾的字符(若字符串末尾是"\r\n"的话,就删除2个字符).
chop
会生成并返回修改后的字符串. 而chop!
会修改self
本身然后返回结果,若没作修改则返回nil.
clone
dup
返回一个与原字符串内容相同的新字符串. 对被冻结的字符串使用clone
会得到一个同样被冻结的字符串,而使用dup
就会得到一个内容相同但未被冻结的字符串.
count(str
[, str2
[, ... ]])
返回在该字符串中str 所含字符出现的次数.
str
的形式与tr(1)
相同.也就是说,`a-c
'表示从a
到c
,而像"^0-9"
这样,当`^
'出现在头部时表示"取反".
只有当`-
'出现在字符串内部,而非两端时才表示指定一个范围.同样地,只有当`^
'出现在字符串头部时才表示"取反".另外,可以使用反斜线(`\
')来对`-
', `^
', `\
'进行转义操作.
若给出多个参数,则意味着会使用所有参数的交集.
p 'abcdefg'.count('c') # => 1 p '123456789'.count('2378') # => 4 p '123456789'.count('2-8', '^4-6') # => 4
以下是该方法的典型应用, 它返回文件的行数(但文件尾部要有换行符).
n_lines = File.open("foo").read.count("\n")
crypt(salt
)
生成并返回一个由self
和salt
加密而成的字符串. salt
是一个由字母或数字、点(.)和斜线(/)构成的2字节以上的字符串.
如下所示,salt 应尽量选择随机的字符组合.
salt = [rand(64),rand(64)].pack("C*").tr("\x00-\x3f","A-Za-z0-9./") passwd.crypt(salt)
一般来说,很难
利用加密后的字符串求出原始字符串(self),所以只有知道原始字符串的人才能生成一模一样的加密字符串. 由此可以验证某人是否知道(self
).
例如,UNIX密码的验证过程如下. (此例中假定可以用 Etc.getpwnam 得到加密字符串).
require 'etc' user = "foo" passwd = "bar" ent = Etc.getpwnam(user) p passwd.crypt(ent.passwd) == ent.passwd
注意 :
- crypt的运行需要crypt(3) 的支持. 请参考系统中的crypt(3) 等来了解crypt处理内容的详情以及设定 salt 的方法.
- 当系统环境发生变化时,crypt的结果往往会出现不同. 因此,若在不同的系统环境中使用crypt的结果时,请充分注意这些差异.
- 在使用了DES的典型的crypt(3) 中,只使用self的最初的8字节和salt的最初的2字节.
delete(str
[, str2
[, ... ]])
delete!(str
[, str2
[, ... ]])
从该字符串中删除str 所包含的字符.
str
的形式与tr(1)
相同.也就是说,`a-c
'表示从a
到c
,而像"^0-9"
这样,当`^
'出现在头部时表示"取反".
只有当`-
'出现在字符串内部,而非两端时才表示指定一个范围.同样地,只有当`^
'出现在字符串头部时才表示"取反".另外,可以使用反斜线(`\
')来对`-
', `^
', `\
'进行转义操作.
若给出多个参数,则意味着会使用所有参数的交集.
p "123456789".delete("2-8", "^4-6") #=> "14569" p "123456789".delete("2378") #=> "14569"
delete
会生成并返回修改后的字符串. 而delete!
会修改self
本身并返回结果,若没作修改时返回nil.
downcase
downcase!
将字符串中的大写字母都改为小写字母.
downcase
生成并返回修改后的字符串.而downcase!
则会修改self
本身并返回结果,若没有作修改,则返回nil.
若没有正确设置$KCODE
时,部分汉字代码也会被修改(在ShiftJIS编码中就会发生这种情况).相反,即使设置了$KCODE
,也不会修改多字节字符的字母.
# -*- Coding: shift_jis -*- $KCODE ='n' puts "帰".downcase # => 蟻
请参考upcase , swapcase , capitalize .
dump
使用反斜线表示法替换字符串中的非显示字符,并返回修改后的字符串.它保证了str == eval(str.dump)
.
puts "abc\r\n\f\x00\b10\\\"".dump #=> "abc\r\n\f\000\01010\\\""
each([rs
]) {|line
| ... }
each_line([rs
]) {|line
| ... }
对字符串中的各行进行迭代操作. 此时,rs 中的字符串将成为行切分符,行切分符的默认值取自变量$/ 的值.各line 中包含用作切分符的字符串.
若将rs
设为nil
时,则意味着不作行的切分. 若设为空字符串""
则将连续的换行当做行切分符(段落模式).
返回self
.
each_byte {|byte
| ... }
对字符串中的各个字节进行迭代操作.
返回self
.
请参考unpack .使用unpack('C*')可以得到以字节为单位的数组.
empty?
若字符串为空(也就是说其长度为0),则返回真.
gsub(pattern
, replace
)
gsub!(pattern
, replace
)
gsub(pattern
) {|matched
| .... }
gsub!(pattern
) {|matched
| .... }
以replace
来替换字符串中所有
与pattern
相匹配的部分. replace
中的\&
和\0
被替换为匹配的子字符串,而\1 ... \9
被替换为第n个括号的内容.在替换字符串replace
中,还可以使用\`
、\'
或\+
. 它们分别对应于$`
、$'
、$+
.
p 'abcabc'.gsub(/b/, '(\&)') #=> "a(b)ca(b)c"
省略replace 参数时,该方法就相当于一个迭代器,它以块的计算结果进行替换. 匹配的子字符串被当做参数传递给块.与没带块时不同的是, 可以在块中调用内部变量$ .
p 'abcabc'.gsub(/b/) {|s| s.upcase } #=> "aBcaBc" p 'abcabc'.gsub(/b/) { $&.upcase } #=> "aBcaBc"
gsub
生成并返回替换之后的字符串.而gsub!
会修改self
本身并返回结果,若没有进行置换时返回nil.
p 'abcdefg'.gsub(/cd/, 'CD') #=> "abCDefg" str = 'abcdefg' str.gsub!(/cd/, 'CD') p str #=> "abCDefg" p 'abbbxabx'.gsub(/a(b+)/, '\1') #=> "bbbxbx"
注意
: 不能在replace
中使用$
.这是因为在对该字符串进行计算时,尚未进行匹配操作所致. 另外,在replace
中必需对\
进行2重转义(请参考trap::\的影响
).
# 使用第二参数时常见的错误 p 'abbbcd'.gsub(/a(b+)/, "#{$1}") # 错误 p 'abbbcd'.gsub(/a(b+)/, "\1") # 错误 p 'abbbcd'.gsub(/a(b+)/, "\\1") # 正确 p 'abbbcd'.gsub(/a(b+)/, '\1') # 正确 p 'abbbcd'.gsub(/a(b+)/, '\\1') # 正确(更安全) p 'abbbcd'.gsub(/a(b+)/) { $1 } # 正确(最安全)
请参考sub .
ruby 1.7 特性 :在1.6版之前,若pattern 是字符串时,会把该字符串编译为正则表达式.在1.7以后的版本中,该字符串本身将成为匹配模型(pattern).
hex
把字符串看做是16进制数形式,并将其变为整数.
p "10".hex # => 16 p "ff".hex # => 255 p "0x10".hex # => 16 p "-0x10".hex # => -16
"0x"和"0X"前缀将被忽略. 若遇到[_0-9a-fA-F]
之外的字符时,就只转换它前面的部分.若变换对象是空字符串,则返回0.
p "xyz".hex # => 0 p "10z".hex # => 16 p "1_0".hex # => 16
请参考oct , to_i , to_f ,Integer ,Float .
如果想把数值变为字符串时,请使用sprintf ,% ,Integer#to_s .
include?(substr
)
若字符串中包含substr 子字符串的话,就返回真.
若substr 是从0到255之间的Fixnum 时,将把它看做是字符代码,若包含该代码所对应的字符,就返回真.
index(pattern
[, pos
])
按照从左到右的顺序搜索子字符串,并返回搜索到的子字符串的左侧位置. 若没有搜索到则返回nil.
在参数pattern 中,可以使用字符串,0到255之间的字符代码或正则表达式来指定想要搜索的子字符串.
若给出了pos 时, 则从相应位置开始搜索.省略pos 时其默认值为 0.
p "astrochemistry".index("str") # => 1 p "character".index(?c) # => 0 p "regexpindex".index(/e.*x/, 2) # => 3
若pos 为负,则从字符串尾部找到相应位置后开始搜索.
p "foobarfoobar".index("bar", 6) # => 9 p "foobarfoobar".index("bar", -6) # => 9
请参考rindex .
insert(nth
, other
) ((<ruby
1
.7
特性
>))
在第nth 个字符的前面插入other 字符串. (除了返回值以外)它等同于
self[nth, 0] = other
返回self
.
str = "foobaz" p str.insert(3, "bar") # => "foobarbaz"
intern
to_sym ((<ruby
1
.7
特性
>))
返回与字符串相对应的符号值(Symbol
). 不能对包含空字符('\0')的字符串进行intern
(会引发ArgumentError
异常).
若想得到与某符号相对应的字符串时,请使用Symbol#to_s (或Symbol#id2name ).
p "foo".intern => :foo p "foo".intern.to_s == "foo" => true
length
size
返回字符串的字节数.
match(regexp
) ((<ruby
1
.7
特性
>))
match(regexp
[, pos
]) ((<ruby
1
.9
特性
>))
与regexp .match(self[, pos])相同(请参考Regexp#match ). 若regexp 是字符串,则将其编译为正则表达式.
next
next!
succ
succ!
返回下一个字符串. 所谓"下一个"是指,按照26个字母顺序或10进制数的顺序继续向下数时得到的结果.这里不考虑负号的问题.请参考下例.
p "aa".succ # => "ab" p "99".succ # => "100" p "a9".succ # => "b0" p "Az".succ # => "Ba" p "zz".succ # => "aaa" p "-9".succ # => "-10" p "9".succ # => "10" p "09".succ # => "10"
若字符串中包含字母或数字的话,则其他字符将保持不变.
p "1.9.9".succ # => # "2.0.0"
相反地,若不包含字母或数字的话,就返回下一个ASCII字符.
p "/".succ #=> "0" p "\0".succ #=> "\001" p "\377".succ #=> "\001\000"
"".succ 会返回 "".如果遇到多字节字符串的话,则只把它当做普通的字节串来处理. 另外,没有与succ动作相反的方法.
succ!
和next!
会强行修改字符串的内容.
oct
将字符串看做是8进制字符串,并将其变为整数.
p "10".oct # => 8 p "010".oct # => 8 p "8".oct # => 0
oct
可根据字符串的前缀("0", "0b", "0B", "0x", "0X")来进行8进制以外的相关处理.
p "0b10".oct # => 2 p "10".oct # => 8 p "010".oct # => 8 p "0x10".oct # => 16
若遇到不能看做整数的字符时,就只变换此前的内容.若变换对象为空字符串,则返回0.
p "1_0_1x".oct # => 65
请参考hex , to_i , to_f ,Integer , Float .
若想把数值变为字符串时,请使用sprintf ,% ,Integer#to_s .
replace(other
)
以other 的内容来替换字符串的内容.
s = "foo" id = s.id s.replace "bar" p s # => "bar" p id == s.id # => true
返回self
.
reverse
reverse!
对字符串进行反转.
p "foobar".reverse # => "raboof"
reverse
生成并返回修改后的字符串.而reverse!
会修改self
本身并返回结果.
rindex(pattern
[, pos
])
按照从右到左的顺序来搜索子字符串,并返回找到的子字符串的左侧的位置. 若搜索失败则返回nil.
在参数pattern 中,可以使用字符串,从0到255之间的字符代码或正则表达式来指定想要搜索的子字符串.
若给出了pos
时,就从相应位置开始搜索. 省略pos
时,其值为self
.size (右端).
p "astrochemistry".rindex("str") # => 10 p "character".rindex(?c) # => 5 p "regexprindex".rindex(/e.*x/, 2) # => 1
若pos 为负,则从尾部找到相对应的位置后开始搜索.
p "foobarfoobar".rindex("bar", 6) # => 3 p "foobarfoobar".rindex("bar", -6) # => 3
该方法的运作情况并非与index 完全相反. 开始搜索时,起始位置当然是从右向左移动,但是对比子字符串时还是从左向右进行的. 请参考下例.
# 使用String#index时 p "foobar".index("bar", 2) # => 3 # bar <- 从这里开始搜索 # bar <- 向右挪动一步后之后对比成功 # 使用String#rindex时 p "foobar".rindex("bar", -2) # => 3 # bar <- 并不是从这里(从尾部算起到子字符串右端正好是第2个)开始搜索的 # bar <- 而是从这里开始搜索(从尾部算起到子字符串的左端正好是第2个) # bar <- 向左挪动一步之后对比成功
scan(re
)
scan(re
) {|s
| ... }
使用正则表达式re
反复对self
进行匹配操作,并以数组的形式返回匹配成功的子字符串.
p "foobar".scan(/./) # => ["f", "o", "o", "b", "a", "r"] p "foobarbazfoobarbaz".scan(/ba./) # => ["bar", "baz", "bar", "baz"]
若正则表达式中包含括号,则返回与括号内的pattern匹配成功的子字符串的数组的数组.
p "foobar".scan(/(.)/) # => [["f"], ["o"], ["o"], ["b"], ["a"], ["r"]] p "foobarbazfoobarbaz".scan(/(ba)(.)/) # => [["ba", "r"], ["ba", "z"], ["ba", "r"], ["ba", "z"]]
若带块调用的话,匹配成功的子字符串(若包含括号时,则是与括号内的pattern匹配成功的字符串的数组)将成为块的形参. 带块调用时返回self.
"foobarbazfoobarbaz".scan(/ba./) {|s| p s} # => "bar" "baz" "bar" "baz" "foobarbazfoobarbaz".scan(/(ba)(.)/) {|s| p s} # => ["ba", "r"] ["ba", "z"] ["ba", "r"] ["ba", "z"]
ruby 1.7 特性 : 在1.6之前的版本中,若re 是字符串的话,则把该字符串编译为正则表达式. 在1,7以后的版本中,该字符串本身将成为pattern.
slice(nth
[, len
])
slice(substr
)
slice(first
..last
)
slice(first
...last
)
slice(regexp
[, nth
])
与self[ ] 相同.
ruby 1.7 特性 : 在1.7以后的版本中,可以使用slice(regexp, nth).
slice!(nth
[, len
])
slice!(substr
)
slice!(first
..last
)
slice!(first
...last
)
slice!(regexp
[, nth
])
从字符串中删除指定的范围(请参考self[ ] ),然后返回删除的子字符串.
若参数超出范围则返回nil.
ruby 1.7 特性 : 在1.7以后的版本中,可以使用slice!(regexp, nth).
split([sep
[, limit
]])
使用sep 指定的pattern来分割字符串,并将分割结果存入数组.
sep 可以是下列之一
- 正则表达式: 把正则表达式的匹配结果当作切分符来切分字符串。如果使用了括号群组的话,与群组相匹配的字符串也会出现在最后的数组中(后文详述)。
- 1字节的字符串:把该字符当作切分符来进行切分(ruby 1.6)。
- 2字节以上的字符串:把与Regexp.new(sep)相匹配的字符串当作切分符来进行切分(ruby 1.6)。
- 省略 或 nil:把$; 的值当作切分符来进行切分。
- 1字节的空白
' '
或 使用了$;
且其值为nil时:除了头部的空白之外,使用空白进行切分。 - 空字符串
''
或 与空字符串相匹配的正则表达式:以单个字符为单位进行切分。可识别多字节字符。
ruby 1.7 特性 : 在1.7之后的版本中,若sep 是字符串的话,不管它的长度如何,都将使用与Regexp.new(Regexp.quote(sep))相匹配的字符串(即该字符串本身)来作为切分符。
例: awk split
p " a \t b \n c".split(/\s+/) # => ["", "a", "b", "c"] p " a \t b \n c".split # => ["a", "b", "c"] ($;的默认值是nil) p " a \t b \n c".split(' ') # => ["a", "b", "c"]
若sep 中的pattern与空字符串相匹配的话,将以单个字符为单位对字符串进行切分(若正确设置了$KCODE 的话,就会自动识别出汉字并进行适当的切分)。例如:
例:以字符为单位进行切分
p 'hi there'.split(/ */).join(':') # => "h:i:t:h:e:r:e" p 'hi there'.split(//).join(':') # => "h:i: :t:h:e:r:e" $KCODE = 'e' p '文字列'.split(//).join(':') # => "文:字:列"
若sep 中的pattern包含括号,则数组中还会出现各括号的匹配结果。若括号不止一个时,则数组中就只剩下匹配结果了。例如:
例:
p '1-10,20'.split(/([-,])/) # => ["1", "-", "10", ",", "20"] p '1-10,20'.split(/(-)|(,)/) # => ["1", "-", "10", ",", "20"]
limit 可以是下列之一。
- 省略 或 0: 删除数组尾部的空字符串。
- limit > 0: 为数组分配至多limit 个元素。
- limit < 0: 相当于指定limit 的值为正无穷。
例: limit 的例子
# 省略limit的话,就如同把它指定为0一样。这将删除数组尾部的空字符串 p "a,b,c,,,".split(/,/) # => ["a", "b", "c"] p "a,b,c,,,".split(/,/, 0) # => ["a", "b", "c"] # 若limit不够大,则将剩余部分全部塞入数组的最后一个元素中 p "a,b,c,,,".split(/,/, 3) # => ["a", "b", "c,,,"] # 若limit的值为-1或超过分割块数时,其值将被自动修改为分割块数 p "a,b,c,,,".split(/,/, 6) # => ["a", "b", "c", "", "", ""] p "a,b,c,,,".split(/,/, -1) # => ["a", "b", "c", "", "", ""] p "a,b,c,,,".split(/,/, 100) # => ["a", "b", "c", "", "", ""]
squeeze([str
[,str2
[, ... ]]])
squeeze!([str
[,str2
[, ... ]]])
压缩由str 所含字符构成的重复字符串。
str
的形式与tr(1)
相同.也就是说,`a-c
'表示从a
到c
,而像"^0-9"
这样,当`^
'出现在头部时表示"取反".
只有当`-
'出现在字符串内部,而非两端时才表示指定一个范围.同样地,只有当`^
'出现在字符串头部时才表示"取反".另外,可以使用反斜线(`\
')来对`-
', `^
', `\
'进行转义操作.
若给出多个参数,则意味着会使用所有参数的交集进行压缩.
p "112233445566778899".squeeze =>"123456789" p "112233445566778899".squeeze("2-8") =>"11234567899" p "112233445566778899".squeeze("2-8", "^4-6") =>"11234455667899" p "112233445566778899".squeeze("2378") =>"11234455667899"
squeeze
会生成并返回修改后的字符串。而squeeze!
会修改self
本身并返回结果。若没作修改则返回nil。
strip
strip!
删除头部和尾部的所有空白字符。空白字符是指" \t\r\n\f\v"。
strip
生成并返回修改后的字符串。
strip!
会修改self
本身并返回结果。若没有进行删除动作,则返回nil。
p " abc \r\n".strip #=> "abc" p "abc\n".strip #=> "abc" p " abc".strip #=> "abc" p "abc".strip #=> "abc" str = "\tabc\n" p str.strip #=> "abc" p str #=> "\tabc\n" (无变化) str = " abc\r\n" p str.strip! #=> "abc" p str #=> "abc" (有变化) str = "abc" p str.strip! #=> nil p str #=> "abc"
ruby 1.8 特性 : 与rstrip 一样,它会删除右侧的空白字符和"\0",但不会对左侧的"\0"进行特殊处理。
str = " \0 abc \0" p str.strip # => "\000 abc"
lstrip ((<ruby
1
.7
特性
>))
lstrip! ((<ruby
1
.7
特性
>))
删除字符串头部的所有空白字符。空白字符是指" \t\r\n\f\v"。
lstrip
会生成并返回加工后的字符串。
lstrip!
会修改self
本身并返回结果。如果没有删除空白字符,则返回nil。
p " abc\n".lstrip #=> "abc\n" p "\t abc\n".lstrip #=> "abc\n" p "abc\n".lstrip #=> "abc\n" str = "\nabc" p str.lstrip #=> "abc" p str #=> "\nabc" (无变化) str = " abc" p str.lstrip! #=> "abc" p str #=> "abc" (有变化) str = "abc" p str.lstrip! #=> nil p str #=> "abc"
rstrip ((<ruby
1
.7
特性
>))
rstrip! ((<ruby
1
.7
特性
>))
删除字符串尾部的所有空白字符。空白字符是指" \t\r\n\f\v"。
rstrip
会生成并返回加工后的字符串。
rstrip!
会修改self
本身并返回结果。如果没有删除空白字符,则返回nil。
p " abc\n".rstrip #=> " abc" p " abc \t\r\n".rstrip #=> " abc" p " abc".rstrip #=> " abc" str = "abc\n" p str.rstrip #=> "abc" p str #=> "abc\n" (无变化) str = "abc " p str.rstrip! #=> "abc" p str #=> "abc" (有变化) str = "abc" p str.rstrip! #=> nil p str #=> "abc"
ruby 1.8 特性 : 删除空白类和 "\0"。而lstrip 则不会删除"\0"。
str = "abc \0" p str.rstrip # => "abc"
sub(pattern
, replace
)
sub!(pattern
, replace
)
sub(pattern
) {|matched
| ... }
sub!(pattern
) {|matched
| ... }
用replace 来替换首次 匹配pattern 的部分。
若带块调用的话,就以块的计算值来替换首次匹配的部分。
sub
生成并返回替换后的字符串。而sub!
会修改self
本身并返回结果。若没有进行替换时返回nil。
除去只进行一次匹配这个特点以外,它与gsub 是相同的。
注意 : 在介绍gsub 时,我们提到了使用 sub/gsub 时应该注意的问题。请参考gsub 。
ruby 1.7 特性 : 在1.6之前的版本中,若pattern 是字符串,则将其编译为正则表达式。在1.7以后的版本中,该字符串本身将成为pattern。
sum([bits
=16
])
计算字符串的bits 位的校验和。它等同于
sum = 0 str.each_byte {|c| sum += c} sum = sum & ((1 << bits) - 1) if bits != 0
例如,可以使用如下代码来得到与System V 的 sum(1) 命令相同的值。
sum = 0 while gets sum += $_.sum end sum %= 65536
swapcase
swapcase!
将所有的大写字母改为小写字母,小写字母改为大写字母。
swapcase
生成并返回修改后的字符串。而swapcase!
则会修改self
本身并返回结果,若没有作修改,则返回nil。
若没有正确设置$KCODE
时,部分汉字代码也会被修改(在ShiftJIS编码中就会发生这种情况)。相反,即使设置了$KCODE
,也不会修改多字节字符的字母.
# -*- Coding: shift_jis -*- $KCODE ='n' puts "蟻".swapcase # => 帰
请参考upcase , downcase , capitalize 。
to_f
将字符串看作是10进制数形式,并将其变为浮点数Float 。
p "10".to_f # => 10.0 p "10e2".to_f # => 1000.0 p "1e-2".to_f # => 0.01 p ".1".to_f # => 0.1 p "nan".to_f # => NaN (ruby 1.7 特性: => 0.0) p "INF".to_f # => Infinity (ruby 1.7 特性: => 0.0) p "-Inf".to_f # => -Infinity (ruby 1.7 特性: => -0.0) p (("10" * 1000).to_f) # => Infinity (ruby 1.7 特性: => out of range (ArgumentError) p "0xa.a".to_f # => 10.625 # 16 进制也可以(取决系统环境) # (ruby 1.7 特性: => 0.0) p " \n10".to_f # => 10.0 # 头部的空白被忽略 p "1_0_0".to_f # => 1.0 # `_' 不能被看作是数值元素 # (ruby 1.7 特性: => 100.0) p "".to_f # => 0.0
将不能被看作浮点数的那个部分之前的内容变为浮点数。若变换对象是空字符串则返回 0.0 。
请参考hex , oct , to_i , Integer , Float 。
若想把数值变为字符串时,请使用sprintf 、% 、Integer#to_s 。
to_i
to_i(base
) ((<ruby
1
.7
特性
>))
将字符串看作是10进制数形式,并将其变为整数。
p " 10".to_i # => 10 p "010".to_i # => 10 p "-010".to_i # => -10
若遇到不能变为整数的字符,就将它前面的内容变为整数。若变换对象为空字符串,则返回0。
p "0x11".to_i # => 0
请参考hex , oct , to_f , Integer , Float 。
若想把数值变为字符串时,请使用sprintf 、% 、Integer#to_s 。
ruby 1.7 特性 : 通过指定不同的基数,还可以进行2~36进制的转换。若指定为0时,则通过 prefix 来判断基数(相反地,只有将其指定为0时,才会识别prefix)。若使用了0、2~36之外的参数时,会引发ArgumentError 异常。
p "0b10".to_i(0) # => 2 p "0o10".to_i(0) # => 8 p "010".to_i(0) # => 8 p "0d10".to_i(0) # => 10 p "0x10".to_i(0) # => 16
to_s
to_str
返回self
。
tr(search
, replace
)
tr!(search
, replace
)
若字符串中包含search 字符串中的字符时,就将其替换为replace 字符串中相应的字符。
search
的形式与tr(1)
相同。也就是说,`a-c
'表示从a
到c
,而像"^0-9"
这样,当`^
'出现在头部时表示"取反"。
replace
中也可以使用`-
'来指定范围。例如,用tr来改写String#upcase
的话,就是
p "foo".tr('a-z', 'A-Z') => "FOO"
这样。
只有当`-
'出现在字符串内部,而非两端时才表示指定一个范围。同样地,只有当`^
'出现在字符串头部时才表示"取反"。另外,可以使用反斜线(`\
')来对`-
', `^
', `\
'进行转义操作。
若replace 所指定的范围比search 的范围小的话,则认为replace 的最后一个字符会一直重复出现下去。
tr
生成并返回替换后的字符串。而tr!
会修改self
本身并返回结果,若没有进行替换操作则返回nil。
tr_s(search
, replace
)
tr_s!(search
, replace
)
若字符串中包含search 字符串中的字符时,就将其替换为replace 字符串中相应的字符。同时,若替换部分中出现重复字符串时,就将其压缩为1个字符。
search
的形式与tr(1)
相同。也就是说,`a-c
'表示从a
到c
,而像"^0-9"
这样,当`^
'出现在头部时表示"取反"。
replace
中也可以使用`-
'来指定范围。
p "foo".tr_s('a-z', 'A-Z') => "FO"
只有当`-
'出现在字符串内部,而非两端时才表示指定一个范围。同样地,只有当`^
'出现在字符串头部时才表示"取反"。另外,可以使用反斜线(`\
')来对`-
', `^
', `\
'进行转义操作。
若replace 所指定的范围比search 的范围小的话,则认为replace 的最后一个字符会一直重复出现下去。
tr_s
生成并返回替换后的字符串。而tr_s!
会修改self
本身并返回结果,若没有进行替换操作则返回nil。
注意
: 该方法的运作方式与tr(search, replace).squeeze(replace)
并不相同。tr与squeeze连用时,会把整个替换后的字符串当作squeeze的对象来处理,而tr_s
只把被替换的部分
当作squeeze的对象来处理。
p "foo".tr_s("o", "f") # => "ff" p "foo".tr("o", "f").squeeze("f") # => "f"
unpack(template
)
按照template 字符串的规则,把被pack起来(可能是由Array#pack 生成)的字符串unpack开来,并以数组的形式返回其结果。请参考pack template字符串 来了解template 字符串的格式。
upcase
upcase!
在ASCII字符串的范围内,将所有字母都变为大写形式。
upcase
生成并返回修改后的字符串。而upcase!
会修改self
本身并返回结果,若没有进行转换操作则返回nil。
若没有正确设置$KCODE
时,部分汉字代码也会被修改(在ShiftJIS编码中就会发生这种情况)。相反,即使设置了$KCODE
,也不会修改多字节字符的字母.
# -*- Coding: shift_jis -*- $KCODE ='n' puts "蟻".upcase # => 帰
请参考downcase , swapcase , capitalize 。
upto(max
) {|s
| ... }
在从self
到max
的范围内,依次取出“下一个字符串”后将其传给块,进行迭代操作。关于“下一个”的定义,请参考String#succ
。
该方法被用在字符串的Range 内部。
例如,下面的代码会输出a, b, c, ... z,aa, ... az, ..., za
。
("a" .. "za").each do |str| puts str end
原文由 webmaster[at]ruby-lang.org 所著
稀亿网络软件(北京)
进行翻译
发表评论
-
Ruby 实现 Java 版本的 PBEWithMD5AndDES 加密:
2024-05-14 10:31 336Ruby 实现 Java 版本的 PBEWithMD5An ... -
gem install mysql2
2022-01-07 15:18 414MACOS M1 gem install mysql ... -
虚拟MFA生成
2021-12-18 15:31 806虚拟MFA生成: import cn.huto ... -
Ruby 字符串连接
2021-01-12 11:15 515Ruby 字符串连接 require 'benc ... -
基于redis实现的锁
2021-01-08 17:43 415代码: class MsgSchedule attr ... -
OpenSSL功能集合
2020-04-22 18:59 467OpenSSL中算法记录 1、证书(X.509证书 ... -
ruby里%的特使用法
2014-05-14 14:50 558转自:http://ruby-china.org/topi ... -
字符串与对象的转化
2014-03-06 10:51 716classify: http://apidock.com/ ... -
ruby 里的正则表示
2014-01-22 17:27 0# ruby 中的正则表示 ... -
应用Selenium进行Web测试
2012-09-11 17:54 766应用Selenium进行Web测试时,经常会遇到下面的几 ... -
ruby mysql2链接数据库
2012-07-04 10:22 856#encoding:utf-8 require " ... -
ruby 解析网页
2012-06-08 11:51 0提示1:在文件头指定程序编码 #coding: ... -
ruby开发中的一些问题及解决办法
2012-06-07 17:39 0ruby开发中各种问题及解决办法 1、ruby调用sh ... -
ruby 操作文件
2012-05-28 17:10 7931.创建文件夹 Dir.new %%1 Dir:: ... -
ruby unicode_str转unicode
2012-04-28 14:17 822endrequire 'yaml' requ ... -
xpath学习
2012-04-25 18:30 970xpath学习 require 'open-uri' r ...
相关推荐
Ruby中的String类提供了许多内置方法来处理Unicode字符,如`codepoints`, `chars`, 和 `each_char`,它们可以帮助开发者遍历和操作字符串中的每个字符或码点。 当遇到Unicode字符串的调试问题时,以下是一些关键...
Ruby 字符串对决这是什么? 这个存储库包含一个用于 A/B 测试 Ruby 代码性能的测试工具,以及一些比较双引号和单引号字符串性能的测试。如何运行测试先决条件: Ruby(这是基于 Ruby 版本 2.2.0,但其他版本应该可以...
在Ruby的世界里,字符串操作是常见的任务之一。为了增强字符串处理能力,开发者们创建了许多库,其中Stringex是一个非常实用的扩展库。本文将深入探讨Stringex库,介绍其提供的各种实用方法,帮助你更好地理解和利用...
在语言特性方面,Ruby-2.2.1引入了数字字符串字面量(Numeric String Literals),这使得创建包含数字的字符串变得更加直观。例如,`'123'`现在可以写成`'123'.to_i`,而无需额外的类型转换操作。另外,这一版本还...
2. **安全的字符串连接操作**:Ruby 2.6引入了`String#%w[]`和`String#%W[]`的升级版,`String#%和`String#%>`, 这使得字符串连接更加安全,减少了潜在的代码注入风险。 3. **改进的模块混合(Mixins)行为**:Ruby...
本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...
在Ruby中,一切都是对象,包括基本数据类型如数字、字符串和布尔值。例如,当你在Ruby中写下"hello",它实际上是一个String对象,你可以调用方法在它上面操作,如`"hello".upcase`会返回"HELLO"。 其次,Ruby的动态...
这一特性允许开发者在字符串字面量中使用#{...}语法来嵌入表达式的值,使得代码更加简洁和可读。例如: ```ruby name = "Alice" puts "Hello, #{name}!" ``` 此外,Ruby-2.3.0还引入了`Hash#dig`方法,这是一个...
在编程领域,字符串(String)是数据处理的基本元素之一,经常需要进行拆分操作。当我们处理包含多个信息片段的字符串时,比如以特定分隔符连接的数据,就需要使用字符串的拆分方法来获取各个部分。本篇文章将深入探讨...
在Ruby-femto中,这些功能的实现可能涉及对文件系统的操作,如`File`类的使用,以及字符串处理,如`String`类的各种方法。例如,`File.open`用于读取或写入文件,而字符串的拼接和替换操作则用于在内存中处理文本...
2. **简洁的语法**:由于基于Ruby的字符串插值,其语法对Ruby开发者来说非常直观,减少了学习曲线。 3. **隔离和安全性**:StringTemplate模板与业务逻辑分离,降低了模板注入攻击的风险。模板只负责呈现数据,不...
Ruby内建支持JSON处理,通过内置的`json`库,我们可以方便地将JSON字符串解析为Ruby对象,或者将Ruby对象转换成JSON字符串。以下将详细讲解Ruby中的JSON实现及其主要功能。 1. **引入json库** 在Ruby中使用JSON...
1. **String**: Redis-Objects将Redis的字符串类型映射为Ruby类的实例方法,例如`key.increment`来增加键的值,或者`key.get`来获取键的当前值。 2. **Hash**: 在Ruby类中,Redis-Objects会创建一个哈希字段,允许...
ruby-string-interpolation 包在双引号字符串中键入 # 以插入 #{} 或将所选内容包裹在其中。 它是如何工作的(除了光标移动,我唯一按下的键是 #):变更日志0.1.5合并 PR #2,如果你在 Find 焦点中,这会阻止它触发...
1. **Unicode 支持**:Ruby 1.9 开始全面支持 Unicode 字符串,使得处理多语言文本变得更加容易。 2. **改进的性能**:通过优化内部实现,1.9.3 提升了运行速度,尤其是对于循环和字符串操作。 3. **更好的错误...
总的来说,Ruby-DeviceDetector是一个强大的工具,它简化了从`User-Agent`字符串中提取设备信息的过程,对于需要对不同设备进行差异化处理的应用来说,是一个非常有价值的库。通过熟练掌握和应用这个库,开发者可以...
2. **灵活性**:Slop支持多种类型的选项,如布尔值(--boolean)、字符串(--string)、整数(--integer)和浮点数(--float)。它还允许你设置默认值、选项的别名以及帮助文本。 3. **自动帮助生成**:Slop可以...
- **基本数据类型**:介绍 Ruby 中的基本数据类型,如整数、浮点数、字符串等。 - **核心类库**:探讨 Ruby 的核心类库,包括 Array、Hash、String 等类的功能及用法。 - **常用方法**:总结常用的核心类方法,如 ...
在Ruby编程语言中,字符串(String)是处理文本数据的基本元素。字符串可以由单引号或双引号定义,其中双引号允许转义字符和变量插入。Ruby中的字符串操作非常灵活,提供了丰富的函数和方法来处理字符串内容。 1. **...