如何在 Ruby 中处理字符串

介绍

_string 是一个或多个字符的序列,可以由字母、数字或符号组成。

Ruby 的字符串是对象,与其他语言不同,字符串是 mutable,这意味着它们可以被更改,而不是创建新的字符串。

你将使用字符串在你写的几乎每一个程序中。字符串允许你使用文本来显示和与用户沟通.事实上,你现在正在阅读的页面是由通过你的Web浏览器在你的屏幕上显示的字符串组成的。

在本教程中,您将学习如何在Ruby中使用字符串,创建字符串,在屏幕上显示它们,将它们存储为变量,将多个字符串合并在一起,并学习如何处理新闻线,散文和双引用等特殊字符。

创建和打印弦

字符串存在于 Ruby 中的单个引文 ' 或双引文 " 中,因此,要创建一个字符串,在一个或另一个字符串中包含一个字符串:

1'This is a string in single quotes.'
2
3"This is a string in double quotes."

您可以选择使用单引文或双引文。在大多数情况下,只要您是一致的,您选择哪个都无关紧要。然而,使用双引文,您可以执行 _string interpolation,您将在本教程中了解。

要在你的程序中显示一个字符串,你可以使用打印方法:

1print "Let's print out this string."

打印方法显示字符串正如所写的那样。

创建一个新的Ruby程序称为print.rb使用文本编辑器,并使用打印方法打印三个字符串:

1[label print.rb]
2print 'This is the first string.'
3print 'This is the second string.'
4print 'This is the third string.'

保存文件并运行程序:

1ruby print.rb

您将看到以下输出:

1[secondary_label Output]
2This is the first string.This is the second string.This is the third string.

打印方法将字符串打印到屏幕上,但如果你想要每个字符串在自己的行上,你必须自己添加一个字符串打破。

如果你想在单独的行上使用三个字符串,请使用插入方法,而不是打印:

1[label print.rb]
2puts 'This is the first string.'
3puts 'This is the second string.'
4puts 'This is the third string.'

现在重新运行该程序,您将看到此输出:

1[secondary_label Output]
2This is the first string.
3This is the second string.
4This is the third string.

插入方法打印了您指定的字符串,但还为您添加了一个新行字符号到字符串的末尾。

在变量中存储字符串

Variables 是指计算机内存中的某个位置,您使用变量来存储数据并在以后获取数据。

若要在变量中存储字符串,请定义变量名称并分配字符串的值:

1my_string = 'This is my string'

然后,以获取值,使用变量的名称:

1print my_string

要自行测试这一点,请用以下命令在编辑器中创建文件 string_variables.rb:

1nano string_variables.rb

然后添加以下代码:

1[label string_variables.rb]
2my_name = "Sammy the Shark"
3my_age = "none of your business"
4
5puts my_name
6puts my_age

这个程序定义了两个变量: my_namemy_age. 每个变量都分配了一个字符串,然后我们使用 puts 方法将每个字符串打印到自己的行上。

将文件保存为CTRL + Xy,然后运行程序:

1ruby string_variables.rb

您将看到以下输出:

1[secondary_label Output]
2Sammy the Shark
3none of your business

通过将字符串分配给变量,您可以避免每次想要使用相同的字符串重复键入,从而更容易在程序中使用和操纵字符串。

让我们看看如何将字符串合并在一起,以创建新的字符串。

紧紧连接

concatenation 是指将两个或两个以上的字符串合并在一起以创建一个新的字符串。 为了连接,我们使用一个+符号表示的concatenation运算器。

以下是如何将字符串sammyshark连接在一起:

1"sammy" + "shark"

这将产生以下产出:

1[secondary_label Output]
2sammyshark

Concatenation 将字符串端到端连接,将它们合并并产生一个全新的字符串值. 如果您想要在字符串sammyshark之间有一个空间,则必须在字符串中包括这个空间,如下:

1"sammy " + "shark"

现在,你实际上不会在程序中写这样的代码,但你需要经常把字符串和变量混合在一起,这就是汇合。

这里有一个例子:

1color = "Blue"
2print "My favorite color is " + color

这将导致输出我最喜欢的颜色是蓝色。注意,我们在字符串中留下一个空间,所以输出将有字符串和输出中的变量值之间的空间。

您可以这样连接多个字符串。 创建文件 concatenation.rb 并添加以下代码:

1[label concatenation.rb]
2my_name = "Sammy the Shark"
3my_age = "none of your business"
4
5puts "My name is " + my_name + " and my age is " + my_age + "."

这个程序定义了两个变量: my_namemy_age,每一个都有自己的分配字符串,就像你以前一样。

当您运行此程序时,您将看到以下输出:

1[secondary_label Output]
2My name is Sammy the Shark and my age is none of your business.

在这个小程序中,您使用 concatenation 将变量插入到这个字符串中。

当您通过连接组合两个或多个字符串时,您正在创建一个新的字符串,您可以在整个程序中使用,因此您可能希望将您创建的字符串分配到一个新的变量,您可以在以后使用:

1[label concatenation.rb]
2my_name = "Sammy the Shark"
3my_age = "none of your business"
4
5# assign concatenated string to variable
6output = "My name is " + my_name + " and my age is " + my_age + "."
7
8# Print the output.
9puts output

在这样的小程序中,使用额外的输出变量可能是不必要的,但在较大的程序中,您可能希望使用连接来创建一个字符串,您可以在多个地方使用它,这也是一个很好的习惯,将数据处理(如连接和算法)从输出中分开,因为最终您的程序会变得更大,并且您需要将逻辑和输出分开成单独的文件或组件,以便更容易管理。

请确保在两个不同的数据类型之间不使用+运算符,例如,您不能将字符串和整数连接在一起。

要查看发生了什么,请创建一个名为 `strings_and_integers.rb’的新程序,其中包含以下内容:

1[label strings_and_integers.rb]
2my_name = "Sammy the Shark"
3my_number = 27
4
5print my_name + my_number

这一次,我们有My_name,其中包含字符串Sammy the SharkMy_number,其中包含整数27。我们知道27不是一个字符串,因为它没有引用。

如果您正在运行该程序:

1ruby strings_and_ints.rb

您将看到此错误消息:

1[secondary_label Output]
2strings_and_ints.rb:4:in `+': no implicit conversion of Integer into String (TypeError)
3from strings_and_ints.rb:4:in `<main>'

错误不 implicit 将 Integer 转换为 String意味着 Ruby 只能将一个字符串连接到现有字符串。

<$>[注] 在 Ruby 版本 2.3 及以下版本中,您会看到此错误消息:

1strings_and_ints.rb:4:in `+': no implicit conversion of Fixnum into String (TypeError)
2from strings_and_ints.rb:4:in `<main>'

在 Ruby 2.4,Fixnum和其对应的Bignum不再存在,而是被Integer取代。

我們可以改變我們的程式,並將數字「27」放在引文中(「27」),以便它被宣佈為一個字符串而不是整數。

1[label strings_and_integers.rb]
2my_name = "Sammy the Shark"
3my_number = 27
4
5print my_name + my_number.to_s

.to_s 方法将整数转换为字符串,这是一个更好的方法,因为它允许我们在我们的程序中将我们的数字保留为整数,当我们打印它时,我们只需要它作为一个字符串,但如果我们必须在我们的程序逻辑的其他部分中使用它,我们可能希望它成为整数。

再次运行该程序,您将看到Sammy the Shark27打印到屏幕上。

将数字转换为链接的字符串是您经常遇到的事情,当您处理代码,货币,电话号码和其他数字数据时,您希望在屏幕上显示文本。

缩小是强大的,但它可以是棘手的。如果您意外放弃其中一个+运算符,您可能会遇到语法错误。如果您必须将含有变量数的字符串合并,则必须将变量转换为字符串。

使用 String 插入

当连接字符串和变量时,输出可能会难以读取和调试,通过允许您嵌入在包含在双引文的字符串中的表达式来解决此问题。

而不是写这个:

1"My name is " + my_name + "!"

你可以这样做:

1"My name is #{my_name}!"

而不是终止字符串并使用+运算符,您将变量与#{}语法关闭,该语法告诉Ruby评估表达式并将其注入到字符串中。

创建一个名为interpolation.rb的新程序,并添加以下代码:

1[label interpolation.rb]
2my_name = "Sammy the Shark"
3my_age = "none of your business"
4
5output = "My name is #{my_name} and my age is #{my_age}."
6
7puts output

这是你已经写的相同的程序,但这一次我们正在使用字符串中断来创建输出。

链接有另一个好处:它可以自动将数字值转换为链接。记住你的 strings_and_integers.rb 程序吗?在编辑器中再次打开该文件,但更改最后一行,以便它看起来如下:

1[label strings_and_integers.rb]
2my_name = "Sammy the Shark"
3my_number = 27
4
5# use interpolation instead of concatenation
6print "My name is #{my_name} and my favorite number is #{my_number}."

Ruby 会自动将 my_number 转换为一个字符串,当你运行它时,你的程序会打印下面的输出:

1[secondary_label Output]
2My name is Sammy the Shark and my favorite number is 27.

字符串交互是强大而方便的,也是与变量连接字符串的首选方法。

字符串和字符串值

请注意,您创建的所有字符串都包含在代码中的引文中,但实际的打印输出不包括引文标记。

每一个字符串都有区别. string literal 是源代码中所写的字符串,包括引文。

这是一个字面上的弦:

1"Sammy the Shark"

字符串值将是萨米鲨鱼

在大多数情况下,您不必担心这种差异,除非您想在字符串中使用特殊字符,如引用标记或断言。

逃避引用和使徒在字符串

由于引文标记被用来表示字符串,如果你想要字符串的引文和引文,你将不得不做一些额外的工作。

如果您尝试在单引文字符串的中间使用一个进程,如下:

1'This isn't what I wanted.'

not中的apostroph结束了字符串,正如你可以从这个例子中奇怪的突出显示中看到的那样。

你会遇到相同的情况,如果你在包含在双引文中的字符串中使用了双引文:

1"Sammy says, "Hello!""

在本示例中,在Hello前的关闭双引用结束了字符串,而在Hello!后的双引用创建了一个新的字符串,没有匹配的双引用来终止它,所以Ruby 会显示错误。

要避免这个问题,你有几个选项。首先,你可以使用替代语法来创建字符串;如果你需要在字符串中使用双引文,请使用单引文来定义字符串,反之亦然。

选项1:使用替代字符串语法

解决这些问题最简单的方法是将字符串包含在单个引文中,当您的字符串需要包含双引文时,并将字符串包含在双引文中,当您的字符串需要使用单个引文时。

而不是用单个引文定义这个字符串:

1'This isn't what I wanted.'

用双重引用来定义:

1"This isn't what I wanted."

而不是使用双引文来定义这个字符串:

1"Sammy says, "Hello!""

使用单一引用:

1'Sammy says, "Hello!"'

使用替代语法可以让你摆脱一些快速的堵塞,但它并不总是会起作用. 例如,这两个方法都不会对这个字符串起作用:

1"Sammy says, "I'm a happy shark!""

在这个例子中,在之前的关闭双引用实际上会把事情扔掉,这会结束第一个字符串,然后Ruby在中会遇到,这会开始一个新的字符串,值是`我是一个快乐的鲨鱼!``但是这个新的字符串没有匹配的单个引用来结束它。

1'Sammy says, "I'm a happy shark!"'

这一次,在中的使徒结束了弦。

使用替代语法也可以使您的代码不一致. 不断在字符串语法之间转换可能会变得困惑,我们可以 escape characters 来绕过这个问题。

选项2:在字符串中逃脱字符

在字符串中,常被称为 _escape 字符的 Backslash 字符(\)将阻止 Ruby 在字面上解释字符串中的下一个字符。

以下是我们有问题的字符串,编码为双引文,里面有双引文:

1"Sammy says, "I'm a happy shark!""

创建一个名为 quoting.rb 的 Ruby 程序,并将此代码添加到文件中:

1[label quoting.rb]
2print "Sammy says, "I'm a happy shark!""

运行这个程序:

1ruby quoting.rb

你会看到这个输出:

1[secondary_label Output]
2quoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
3print "Sammy says, "I'm a happy shark!""
4^

要修复错误,请使用内部双重引用前面的反转:

1[label quoting.rb]
2print "Sammy says, \"I'm a happy shark!\""

然后再次运行该程序,您将看到您预期的输出:

1Sammy says, "I'm a happy shark!"

请注意,在本例中,您不必逃避使徒,因为没有冲突,您只需要逃避引文,这将使Ruby感到困惑。

您可以通过使用不同的语法来定义字符串来完全避免逃避引文。

选项 3: 使用 alternate syntax for strings

到目前为止,你已经使用引文来定义你的字符串的界限。你也可以使用其他字符在 Ruby 中创建字符串。你可以定义 delimiter,或者你想用来关闭你的字符串的字符串,通过在百分比符号之后指定它,如下:

1%$Sammy says, "I'm a happy shark!"$

此语法将自动为您摆脱嵌入式字符串. 实际字符串看起来如下:

1"Sammy says, \"I'm a happy shark!\""

但是,更改界限器意味着您必须逃避界限器,如果需要使用它,在这种情况下,如果您必须在字符串中使用美元符号,则需要逃避字母字符串中的美元符号。

为了避免这种情况,您还可以使用两对轴承,平方轴承或轴承作为界限。

1%{Sammy says, "I'm a happy shark!"}

这些表单都支持 string 插入,如果需要的话。

1droplets = 5
2print %{Sammy says, "I just created #{droplets} droplets!"}

您还会看到在 Ruby 程序中用来定义字符串的 %Q{} 和 `%q{}' 。

1droplets = 5
2print %Q{Sammy says, "I just created #{droplets} droplets!"}

%q{}语法完全像单引用字符串:

1%q{Sammy says, "I'm a happy shark!"}

您可能会看到%q%Q语法,在某些程序中使用子或方形子,而不是弯曲子。

正如您所看到的,在 Ruby 中创建字符串的方法有很多,无论您选择哪种方法,都要在代码中保持一致,您会发现%Q{}%{}是最常见的方法。

现在你知道如何处理特殊字符,让我们看看如何处理长串和新线字符。

长串和新闻

有时你可能想要插入一个新行字符,或车辆返回你的字符串. 你可以使用\n\r逃避字符插入新行代码:

1output = "This is\na string\nwith newlines"
2puts output

该计划将产生此产出:

1[secondary_label Output]
2This is
3a string
4with newlines

这在技术上是为了使我们的输出在多个行上。然而,在单行上写一个非常长的字符串很快就会变得非常难读和工作。

首先,您可以使用连接运算器将字符串分成多个行:

1output = "This is a\n" +
2"longer string\n" +
3"with newlines."
4puts output

这只是将三个字符串连接在一起,类似于你已经做的。

您也可以只在字符串中直接放置线条:

1output = "This is a
2longer string
3with newlines"
4puts output

您还可以使用任何替代字符串语法来创建多行字符串:

1output = %{This is a
2longer string
3with newlines}
4puts output

在这两个例子中,请注意,我们不需要新线(\n)字符,这种方法保留了白空间,包括入口和新线。

因此,输出将包含线路断裂,以及所有领先的插头,如下:

1[secondary_label Output]
2This is a
3longer string
4with newlines

要防止这种情况发生,请从代码中删除额外的白色空间:

1output = %{This is a
2longer string
3with newlines
4}

您还可以使用 heredoc,或这里的文档创建多行字符串,这个术语用于程序中的多行字符串。

1output = <<-END
2This is a
3longer string
4with newlines
5END

标记<-ENDEND标记表示继承的开始和结束。

Heredocs 在 Ruby 中还保留了白空间字符,这意味着如果你在 heredoc 中输入代码,领先的输入也保留了。

1output = <<-END
2This is a
3longer string
4with newlines
5END

将用两个印刷空间打印出来。

Ruby 2.3 和更高版本提供squiggly heredoc语法,该语法会自动删除该领先的白色空间。

1output = <<~END
2This is a
3longer string
4with newlines
5and the code is indented
6but the output is not.
7END

这产生了以下产出:

1[secondary_label Output]
2This is a
3longer string
4with newlines
5and the code is indented
6but the output is not.

这允许您使用 heredocs,并保持您的代码精心插入。

Heredocs 在 Ruby 中也支持字符串交互。

正如你所看到的,在 Ruby 中,有许多方法可以处理新闻稿和多行字符串。当你使用现有 Ruby 代码时,你会遇到所有这些方法,因为每个项目都有自己的风格。

String 复制

有些时候你可能需要使用 Ruby 来重复一个字符串几次。你可以使用 * 操作员。像 + 操作员一样, * 操作员在与数字一起使用时有不同的用途,在那里它是以一个字符串和一个整数一起使用的操作员。

要打印Sammy九次,你会使用以下代码:

1print "Sammy" * 9

此代码产生以下输出:

1[secondary_label Output]
2SammySammySammySammySammySammySammySammySammy

创建一个名为banner.rb的文件,并添加以下代码:

1puts "=" * 15
2puts "| Hello World |"
3puts "=" * 15

你能想象一下程序在运行之前会产生什么?

它产生了这样的产量:

1[secondary_label Output]
2===============
3| Hello World |
4===============

这是你如何让计算机为你执行重复任务的一个小例子。

结论

在本教程中,您学会了如何在 Ruby 编程语言中使用字符串数据类型工作. 您创建了新的字符串,将它们与其他字符串相连,并处理了新闻线,引文和断言。

Published At
Categories with 技术
Tagged with
comments powered by Disqus