如何使用Ruby中的“split”方法

Python010

如何使用Ruby中的“split”方法,第1张

正如你所知道的,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不能正确分隔这个字符串的域。为了做到正确分隔,需要保持字符串扫描器处于开启状态,这样一来它就会记得它有没有在引证串内部。反之,如果扫描仪不在启动状态,就不能解决这样的问题。

在 ruby 中,{|args| statements} 叫做 匿名函数,就是没有名字的小型函数。然后 each_byte 是一个方法,它接收一个可调用对象。

有时候左花括号可以用 do 代替,有花括号用 end 代替,就是

do |args|

statements

end

这种形式。

1. 字符串和符号,都是Ruby中表示文本的方式

不管字符串变量也好,符号变量也好,都是用来表示文本的,它们之间,也可以互相转换(通过to_sym和to_s):

>> "book".to_sym

=>:book

>> :track.to_s

=>"track"

2. 相同的符号是一个对象,相同的字符并不一定是一个对象

这就是符号和字符串最大的差别,符号是不可变的,不能对一个符号进行修改。所以说,两个看起来相同的符号一定是一个对象,但是说两个看起来一样的字符串是一个对象,就不对了。

这里,我们用 equal? 方法检验这一点,当两个对象相同时,equal返回true,反之是false:

>> :book.equal?(:book)

=>true

>> "book".equal?("book")

=>false