使用String#split方法在Ruby中拆分字符串

除非用户输入是单个单词或数字,否则该输入将需要拆分或转换为字符串或数字列表。

例如,如果一个程序要求您的全名,包括中间首字母,它首先需要将该输入分成三个单独的字符串,然后才能与您的个人名字,中间名字和姓氏一起使用。这是使用String#split方法实现的。

String#split如何工作

在最基本的形式中,String#split采用单个参数:字段分隔符作为字符串。将从输出中删除此分隔符,并返回在分隔符上拆分的字符串数组。

因此,在下面的示例中,假设用户正确输入他们的姓名,您应该从拆分中收到一个三元素数组

#!/usr/bin/env ruby
print"您的全名是什么?"
全名=gets.chomp
姓名=完整_name.split('')
放置"您的名字是#{姓名}"
放置"您的姓氏是#{名称。最后}"

如果我们运行此程序并输入一个名称,我们会得到一些预期的结果。另外,请注意姓名and名称。最后是巧合。name变量将是数组,这两个方法调用将等价于name[0]name[-1]分别。

$红宝石split.rb
你的全名是什么?Michael C.Morin
你的名字是Michael
你的姓氏是Morin

然而,String#split比你更聪明'd想。如果String#split的参数是一个字符串,它确实使用它作为分隔符,但如果参数是一个带有单个空格的字符串(如我们所使用的),则它推断您想要拆分任意数量的空白,并且您还想删除任何领先的空白。

所以,如果我们给它一些稍微的错误ormed输入,如

Michael C.Morin

(有额外的空格),那么String#split仍然可以做预期的事情。但是,当您将字符串作为**个参数时,这是**的特殊情况。正则表达式分隔符

你也可以通过一个正则表达式作为**个参数。在这里,String#split变得更加灵活。我们也可以让我们的小名拆分代码更聪明。

我们不需要't想要中间初始末尾的时间段。我们知道它'是一个中间初始值,数据库赢得了't想要一个周期,所以我们可以在拆分时删除它。当String#split与正则表达式匹配时,它会做同样的事情,就像它刚刚匹配一个字符串分隔符一样:它将它从输出中取出并在此时分割它。

所以,我们可以稍微发展一下例子:

$猫split.rb
#!/usr/bin/env ruby
print"您的全名是什么?"
全名=gets.chomp
姓名=完整_name.split(/\.?\s+/)
放置"您的名字是#{姓名}"
放置"中间首字母为#{name[1]}"
放置"您的姓氏为#{名称。最后}"

默认记录分隔符

Ruby在"特殊变量"您可能在Perl等语言中找到,但String#split确实使用了您需要注意的语言。这是默认的记录分隔符变量,也称为$;

它'是一个全局,你不常用'经常在Ruby中看到,所以如果你改变它,它可能会影响代码的其他部分,只需确保在完成后将其更改回来。

但是,所有这个变量都是**个参数String#split的默认值。默认情况下,此变量似乎设置为nil。但是,如果String#split'、 **个参数是nil,它将用单个空格字符串替换它。

零长度分隔符

如果传递给String#split的分隔符是零长度字符串或正则表达式,则String#split的行为会有所不同。它将从原始字符串中删除任何内容并拆分每个字符。这实质上将字符串转换为长度相等的数组,其中仅包含一个字符串,字符串中的每个字符一个。

这对于遍历字符串非常有用,并且在pre-1.9.x和pre-1.8.7(从1.9.x反向移植了许多功能)中用于迭代字符串中的字符而不用担心分解多字节Unicode字符。但是,如果您真正想要做的是迭代一个字符串,并且您'重新使用1.8.7或1.9.x,则可能应该使用string#each#char

#!/usr/bin/env ruby
str="她把我变成了一只蝾螈!"
str.split('')。每个do | c |
将c
end

限制返回数组的长度

那么回到我们的名称解析示例,如果某人的姓氏有空格呢?例如,荷兰姓氏通常可以以"van"(意思是水果科普"of"or"from")开头。

我们只需要一个3元素数组,所以我们可以使用第二个参数来String#split,这是我们迄今为止忽略的。第二个参数预计是Fixnum。如果这个参数是肯定的,那么最多很多元素将被填充到数组中。所以在我们的例子中,我们想通过3来论证这个论点。

#!/usr/bin/env ruby
print"您的全名是什么?"
全名=gets.chomp188>name=full_name.split(/\.?\s+/,3)
放置"您的名字是#{姓名}"
放置"您的中间首字母是#{name[1] }"
放置"您的姓氏是#{名称。最后}"

如果我们再次运行并给它一个荷兰语名称,它将按预期行事。

$红宝石split.rb
你的全名是什么?Vincent Willem van Gogh 202你的名字是Vincent 203你的中间名字是Willem 204你的姓氏是van Gogh 205

但是,如果此参数为负数(任何负数),则对输出数组中的元素数没有限制,并且任何尾随分隔符将在数组末尾显示为零长度字符串。

这在IRB片段中得到了证明:

:001&>"这是a,测试,,,,,&##34;.split(&\35; 39;,&\35; 39;,-1)
&&##
>:001&"这是a,测试,,,,&35; 34;,这是a,测试,,,,,,&\35; 34;.split(&\ා39;,&\35; 39;,-1)

教育_1