复制代码 代码如下:
>>%Q(Joe said: "Frank said: "#{what_frank_said}"")
=>"Joe said: "Frank said: "Hello!"""
(...)也可用其他非数字字母的符号或成对的符号代替, 诸如[...], !...!, +...+,{...}, <...>等.
以下写法全部与上面等效:
复制代码 代码如下:
>>%Q!Joe said: "Frank said: "#{what_frank_said}""!
>>%Q[Joe said: "Frank said: "#{what_frank_said}""]
>>%Q+Joe said: "Frank said: "#{what_frank_said}""+
除此之外还可省略Q写作:
复制代码 代码如下:
>>%/Joe said: "Frank said: "#{what_frank_said}""/
=>"Joe said: "Frank said: "Hello!"""
%q
与%Q类似, 但是表示的是单引号字符串
复制代码 代码如下:
>>%q(Joe said: 'Frank said: '#{what_frank_said} ' ')
=>"Joe said: 'Frank said: '\#{what_frank_said} ' '"
%W
语法近似于%Q, 用于表示其中元素被双引号括起的数组.
复制代码 代码如下:
>>%W(#{foo} Bar Bar\ with\ space)
=>["Foo", "Bar", "Bar with space"]
%w
用于表示其中元素被单引号括起的数组. 比较奇怪的是\(斜杠空格)会被转化成(空格), 但是其他的内容不会.
复制代码 代码如下:
>>%w(a b c\ d \#e #{1}f)
=>["a", "b", "c d", "\\#e", "\#{1}f"]
%x
使用`方法执行一段shell脚本并返回标准输出内容.
复制代码 代码如下:
>>%x(echo foo:#{foo})
=>"foo:Foo\n"
%r
语法近似于%Q, 用于正则表达式.
复制代码 代码如下:
>>%r(/home/#{foo})
=>"/\\/home\\/Foo/"
%s
用于表示symbol, 但是不会对其中表达式等内容进行转化
复制代码 代码如下:
>>%s(foo)
=>:foo
>>%s(foo bar)
=>:"foo bar"
>>%s(#{foo} bar)
=>:"\#{foo} bar"
%i
Ruby 2.0 之后引入的语法, 用于生成一个symbol数组
2.0.0p247 :014 >%i(a b c)
=>[:a, :b, :c]
正如你所知道的,ruby字符串被称为一流的对象,它使用了大量的查询和操作方法。一个最基本的字符串操作是把一个字符串分割成多个子字符串。如果你有一个字符串,如“foo,bar,
baz”而你希望的是这样三个字符串“foo”,“bar”,“baz”。那么字符串类的split方法就可以帮助你。
“split”的基本用法
split方法的最基本用法分裂一个由单独字符或字符的静态序列组成的字符串。如果split的第一个变量是一个字符串,那么这个字符串中字符就会被当作一个字符串分隔符使用。但是在逗号分隔的数据中,逗号用来分隔数据,这里的每个字符串成分都被用来分隔数据。
#!/usr/bin/env
rubystr
=foo,bar,bazputsstr.
split(,)$
./1.rbfoobarbaz通过正则表达式来增加灵活性
当然,还有一些更容易的方法可以分隔字符串。正则表达式可以为split方法增加灵活性。这里再次拿“foo,
bar,
baz”。间隔在第一个逗号之后而不是第二个逗号。如果该字符串“,”被当成是分隔符,那么在“baz”字符串的开始处仍然会存在间隔。如果使用“,”字符串,它只与第一个逗号匹配,因为第二个逗号后面没有间隔。其作用还是有限的。
解决这个问题的办法是把正则表达式作为定界符的自变量,而不是使用字符串。正则表达式不仅可以匹配静态序列的字符,对字符的不定量和可选字符都同样起作用。
编写正则表达式
为你的分隔符编写一个正则表达式,第一步就是描述清楚什么是分隔符。在这种情况下,一个逗号后面可能存在一个或多个空格是合理的。这一正则表达式库中存在两个要素:逗号和可选的间隔。间隔会使用*
(星号)量词,它表示的意思是“零或更多”。任何在它之前的要素都会匹配零次或若干次。例如,正则表达式/
a
*
/将匹配序列零或更多“a”字符。
#!/usr/bin/env
rubystr
=foo,
bar,bazputsstr.
split(
/,
*/
)$
./2.rbfoobarbaz限制splits的数量
想象一个逗号分隔了这样的字符串:“10,20,30,this
is
an
arbitary
string”。其格式是三个数字后面跟了一句评论。此评论可以包含任意的文本,包括带有逗号的文本。要防止split分离文本这个文本,我们可以设置一个最大分裂列数。请注意,只有在任意文本的评论字符串处在表格最后一列时才管用。
为了限制splits的数量,字符串中数域的数量要作为split方法的第二个变量来发送。
#!/usr/bin/env
rubystr
=10,20,30,ten,
twenty
and
thirtyputsstr.
split(
/,
*/,
4
)$
./3.rb102030en,
twentyandthirty了解其局限性
分裂法有一些局限性。以字符串“10,20,
‘bob,
eve
and
mallory’,30”为例。预期字符是两个数字,后跟一个引证串(可能包含逗号),然后是另一个数字。split不能正确分隔这个字符串的域。为了做到正确分隔,需要保持字符串扫描器处于开启状态,这样一来它就会记得它有没有在引证串内部。反之,如果扫描仪不在启动状态,就不能解决这样的问题。
a =“world”a["w"] = w
a["s"] = nil
你可以参考ruby string 的官方文档,基本上string 所有自带的方法都有,并且有例子
http://ruby-doc.org/core-2.1.2/String.html#method-i-match