使用string#split方法在ruby中拆分字符串

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

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

female using a laptop and a mouse

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

字符串分割的工作原理

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

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

#!/usr/bin/env rubyprint "What is your full name? "full_name = gets.chompname = full_name.split(' ')puts "Your first name is #{name.first}"puts "Your last name is #{name.last}"

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

$ ruby split.rbWhat is your full name? Michael C. MorinYour first name is MichaelYour last name is Morin

然而,String#split比你想象的要聪明一些。如果String#split的参数是一个字符串,它确实使用它作为分隔符,但是如果该参数是一个带有单个空格的字符串(如我们所使用的),那么它会推断您希望拆分任意数量的空格,并且还希望删除任何前导空格。

所以,如果我们给它一些稍微畸形的输入,比如

Michael C. Morin

(使用额外的空格),则字符串#split仍将执行预期的操作。但是,当您将字符串作为第一个参数传递时,这是唯一的特殊情况。正则表达式分隔符

还可以传递正则表达式作为第一个参数。在这里,字符串分割变得更加灵活。我们还可以使我们的小名称拆分代码更智能一些。

我们不希望周期在中间首字母的末尾。我们知道这是一个中间的首字母,数据库不需要一个句号,所以我们可以在拆分时删除它。当String#split与正则表达式匹配时,它会执行与刚刚匹配字符串分隔符相同的操作:将其从输出中取出并在该点拆分。

因此,我们可以稍微改进一下我们的示例:

$ cat split.rb#!/usr/bin/env rubyprint "What is your full name? "full_name = gets.chompname = full_name.split(/\.?\s+/)puts "Your first name is #{name.first}"puts "Your middle initial is #{name[1]}"puts "Your last name is #{name.last}"

默认记录分隔符

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 rubystr = "She turned me into a newt!"str.split('').each do|c| puts cend

限制返回数组的长度

回到我们的名字解析示例,如果某人的姓氏中有空格怎么办?例如,荷兰人的姓氏通常可以以“van”(意思是“of”或“from”)开头。

我们实际上只需要一个3元素数组,所以我们可以使用第二个参数来字符串#split,到目前为止我们已经忽略了这个参数。第二个参数应该是Fixnum。如果此参数为正,则最多会在数组中填充许多元素。在我们的例子中,我们希望这个参数通过3。

#!/usr/bin/env rubyprint "What is your full name? "full_name = gets.chompname = full_name.split(/\.?\s+/, 3)puts "Your first name is #{name.first}"puts "Your middle initial is #{name[1]}"puts "Your last name is #{name.last}"

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

$ ruby split.rbWhat is your full name? Vincent Willem van GoghYour first name is VincentYour middle initial is WillemYour last name is van Gogh

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

这在IRB片段中得到了演示:

:001 > "this,is,a,test,,,,".split(',', -1) => ["this", "is", "a", "test", "", "", "", ""]

  • 发表于 2021-10-03 02:16
  • 阅读 ( 164 )
  • 分类:编程

你可能感兴趣的文章

字符串缓冲区(string stringbuffer)和java中的stringbuilder(stringbuilder in java)的区别

...er与stringbuilder String、StringBuffer和stringbuilder是Java中的类。字符串在Java编程中被广泛使用。一旦创建了字符串对象,就不可能更改它们。每次字符串发生更改时,它都会创建一个新字符串。即使是连接到现有字符串,它也会创建...

  • 发布于 2020-10-02 19:22
  • 阅读 ( 311 )

学习python?下面是如何操作字符串

使用Python可以通过多种方式操纵字符串。Python提供了各种函数、操作符和方法,可以用来操作字符串。您可以分割一个字符串,连接两个或多个字符串,在字符串中**变量,等等。 ...

  • 发布于 2021-03-11 10:21
  • 阅读 ( 328 )

java8lambdas简介

...一个lambda表达式,它创建了一个用于不区分大小写地比较字符串的比较器。 ...

  • 发布于 2021-03-12 08:09
  • 阅读 ( 240 )

最适合新手的ruby互动介绍

...言中。本教程将教您语言的绝对基本构建块(包括数字、字符串、属性和方法)。您只需要键入像“2+6”这样简单的东西,看看Ruby如何处理数学操作符。 ...

  • 发布于 2021-03-13 09:52
  • 阅读 ( 214 )

如何在windows中拆分和合并大文件

...面的应用程序将为您提供一些不同的选项,以满足大多数使用情况。选择一个合适的,你会有你的大文件分裂成可管理的块在任何时候。 ...

  • 发布于 2021-03-14 09:31
  • 阅读 ( 444 )

如何使用这9个函数在php中操作文本

字符串是许多编程语言(包括PHP)中的基本标量类型之一。它们表示从单个字符到整个文档的文本数据。 ...

  • 发布于 2021-03-27 01:14
  • 阅读 ( 233 )

如何在google工作表中拆分文本

...每个字符都是单独考虑的,这与前面的方法不同,前者在字符串中查找“@.”,然后返回一个不变的数据集。 相关:最好的谷歌表插件 下一步,双击蓝色方框将此函数应用于其余单元格。 该函数发挥了它的魔力,并巧妙地从数...

  • 发布于 2021-04-03 13:28
  • 阅读 ( 148 )

python(python)和红宝石(ruby)的区别

...例的属性,而不是整个类的属性。与Python不同,Ruby中的字符串是可变的,但是可以使用freeze方法进行更改。事实上,实际上Ruby中的所有东西在默认情况下都是可变的,并且可以修改。 框架 –Django、Flask、web2py、Bottle、Google App...

  • 发布于 2021-06-25 22:26
  • 阅读 ( 246 )

弦理论(string theory)和环量子引力(loop quantum gravity)的区别

...论是根据理论中假设的弦的类型来分类的。有两种类型的字符串循环:可以拆分为开放字符串循环的闭合字符串循环和不能拆分为开放字符串的闭合字符串循环。弦的大小被认为是普朗克长度或10-35米左右。所以,如果字符串真...

  • 发布于 2021-06-27 20:45
  • 阅读 ( 265 )

字符串文字(string literal)和java中的string对象(string object in java)的区别

...String Object的主要区别在于String Literal是使用双引号创建的字符串,而String Object是使用new()运算符创建的字符串。 字符串是一组字符。通常,在大多数应用程序中都需要执行字符串操作。Java是一种高级的通用编程语言。因此,...

  • 发布于 2021-07-02 01:44
  • 阅读 ( 844 )
胖芡粉
胖芡粉

0 篇文章

相关推荐