Ruby strings有许多内置方法可以轻松修改和操作文本,这是许多程序中的常见任务。
在本教程中,您将使用字符串方法来确定字符串的长度、索引和拆分字符串以提取子字符串、添加和删除空格和其他字符、更改字符串中字符的大小写以及查找和替换文本。完成后,您将能够将这些方法合并到您自己的程序中。
字符串方法length
返回字符串中的字符数。当您需要强制执行最小或最大密码长度,或者将较大的字符串截断到一定限制内以用作缩写时,此方法非常有用。
这是一个打印句子长度的示例:
open_source = "Sammy contributes to open source."
print open_source.length
Output
33
请记住,每个字符(包括字母、数字、空白字符和符号)都会被计算在内,因为它是字符串的一部分。
要检查字符串是否为空,可以检查其长度是否为0
,或者您可以使用empty?
method:
name = ""
name.empty? # true
name = "Sammy"
name.empty? # false
name = " "
name.empty? # false
让我们看看如何索引字符串并访问字符串的内容。
要打印或处理字符串中的某些字符,请使用slice
获得您想要的部分的方法。
Like arrays,其中每个元素对应一个索引号,字符串的每个字符也对应一个索引号,从索引号0开始。
对于字符串Sammy
索引细分如下:
The slice
方法允许您抓取单个字符或一系列字符。传递单个整数将返回该索引处的字符。传递两个整数,用逗号分隔,告诉slice
返回从第一个索引到最后一个索引(含)的所有字符。这slice
方法还接受一个范围,例如1..4
,指定要提取的字符:
"Sammy".slice(0) # "s"
"Sammy".slice(1,2) # "am"
"Sammy".slice(1..4) # "ammy"
The []
语法是一个别名slice
,所以你可以像数组一样对待字符串:
"Sammy"[0] # "s"
"Sammy"[1,2] # "am"
"Sammy"[1..4] # "ammy"
您还可以使用负索引访问字符串末尾的单个字符。-1
会让你访问字符串的最后一个字符,-2
将访问倒数第二个,依此类推。
最后,您可以使用以下命令将字符串转换为字符数组chars
method:
"sammy".chars # ["S", "a", "m", "m", "y"]
这对于操作或转换字符串中的字符非常有用。
接下来,让我们看看如何更改字符串中字符的大小写。
The upcase
and downcase
方法返回一个字符串,其中原始字符串的所有字母都转换为大写或小写字母。字符串中任何非字母的字符都不会被更改。
我们来转换一下字符串Sammy Shark
全部大写:
name = "Sammy Shark"
print name.upcase
Ouput
SAMMY SHARK
现在,让我们将字符串转换为全部小写:
Ouput
sammy shark
The upcase
and downcase
通过使大小写始终保持一致,函数可以更轻松地评估和比较字符串。例如,如果您要求输入用户名,并且用户输入了大写字母的用户名,您可以将用户的输入小写,并将其与小写的已知值进行比较。
Ruby 字符串也有一个capitalize
返回第一个字符大写的新字符串的方法:
"sammy".capitalize # "Sammy"
这是一种方便的方法,但要小心使用方法;它只将第一个字母大写,因此它可能并不总是适合您需要的用例。
Ruby 还提供了swapcase
返回大小写交换的字符串的方法:
text = "Sammy"
print text.swapcase
sAMMY
The downcase
, upcase
, captalize
and swapcase
方法都返回一个新字符串并保持现有字符串不变。如果您要做的事情不是立即打印文本,记住这一点很重要。看一下下面的例子:
text = "sammy"
text.capitalize
print "Hello, #{text}!"
Output
Hello, sammy!
尽管我们打电话capitalize
on the text
变量,我们从未捕获过返回的值capitalize
。我们需要像这样重写程序:
text = "sammy"
text = text.capitalize
print "Hello, #{text}!"
Output
Hello, Sammy!
您可以使用downcase!
, upcase!
, capitalize!
and swapcase!
改为修改原始字符串:
text = "sammy"
text = text.capitalize!
print "Hello, #{text}!"
不过要小心。改变原始字符串有一些缺点。 Ruby 提供了这两种方法,因此您可以选择适合您需要的一种。
现在让我们在字符串中添加和删除空格。
如果您正在编写一个必须格式化某些文本的程序,您经常会发现需要在字符串前面、后面或周围添加一些空格,以便使其与其他数据对齐。有时,您可能希望从字符串的开头或结尾删除不必要的字符,例如多余的空格或特殊字符。
要使用空格包围字符串,请使用center
method:
"Sammy",center(21) # " Sammy "
如果您想使用不同的字符,可以指定一个字符串作为第二个参数:
" [Sammy] ".center(21, "<>") # "<><><> [Sammy] <><><>"
The ljust
and rjust
方法在字符串的左侧或右侧添加空格或字符,其工作方式与center
method:
"Sammy".ljust(20) # "Sammy "
"Sammy".rjust(20) # " Sammy"
"Sammy".rjust(20, "!") # "!!!!!!!!!!!!!!!Sammy"
要从字符串中删除前导空格,请使用rstrip
方法。要删除尾随空格,请使用lstrip
. Use strip
删除前导和尾随空格:
" Sammy".rstrip # "Sammy"
"Sammy ".lstrip # "Sammy"
" Sammy ".strip # "Sammy"
您可以使用center!
, ljust
!, rjust!
, lstrip!
, rstrip!
, and strip!
方法修改原始字符串。
有时您需要从字符串末尾删除字符。红宝石的chop
方法就是这样做的;它从字符串中删除最后一个字符:
这对于删除换行符特别有用(\n
) 来自字符串:
"This string has a newline\n".chop
The chop
方法保持原始字符串不变,返回一个新字符串。这chop!
方法就地修改现有字符串。
The chomp
方法可以从字符串末尾删除多个字符:
"Sammy".chomp("my") # "Sam"
如果您没有指定要删除的字符串,chomp
将删除换行符:
"This string has a newline\n".chomp # "This string has a newline
但是,如果字符串不包含换行符,chomp
只返回原始字符串:
这使得chomp
删除换行符时使用比使用更安全chop
方法,它总是删除最后一个字符。
红宝石有一个chomp!
改变原始字符串的方法,如果执行了替换,则返回修改后的字符串。然而,与chomp
, the chomp!
方法返回nil
如果它没有改变字符串:
string = "Hello\n"
string.chomp! # "Hello"
string = "Hello"
string.chomp! # nil
接下来,我们看看如何在字符串中搜索文本。
有时您需要确定一个字符串是否包含另一个字符串。
The include?
方法检查一个字符串是否包含另一个字符串。它返回true
如果字符串存在并且false
if not:
"Sammy".include?("a") # true
"Sammy".include?("b") # false
The index
方法返回字符的索引。它还可以识别子字符串第一个字符的索引。它返回nil
如果字符或子字符串不存在:
"Sammy".index("a") # 1
"Sammy".index("mm") # 2
"Sammy".index("Fish") # nil
The index
但方法只能找到第一次出现的情况。这是一个较长字符串的示例:
text = "Sammy has a balloon"
text.index("a") # 1
字符串Sammy has a balloon
字母“a”出现了四次。但index
只找到第一个出现的地方。您必须编写更具体的内容才能找到其他事件之一。
例如,您可以将字符串转换为字符数组并使用数组方法迭代结果并选择字符的索引。这是执行此操作的一种方法:
text = "Sammy has a balloon"
indices = text.chars
.each_with_index
.select{|char, index| char == "a" }
.map{|pair| pair.last}
print indices
[1, 7, 10, 13]
each_with_index
返回一个二维数组,其中包含每个字符的条目及其索引。select
将其缩减为仅包含角色所在的条目a
, and map
将二维数组转换为索引的一维数组。
除了查找字符串中的字符之外,您还可以使用以下命令检查字符串是否以字符或子字符串开头start_with?
method:
text = "Sammy has a balloon"
text.start_with?("s") # true
text.start_with?("Sammy has" # true
The start_with?
方法接受多个字符串,如果其中任何一个匹配,则返回 true:
text = "Sammy has a balloon"
text.start_with?("Sammy the Shark", "Sammy") # true
在此示例中,未找到“Sammy the Shark”,但找到了“Sammy”,因此返回值为true
.
您可以使用end_with?
方法查看字符串是否以给定子字符串结尾。它的工作原理完全一样start_with?
:
text = "Sammy has a balloon"
text.end_with?("balloon") # true
text.end_with?("boomerang") # false
text.end_with?("boomerang", "balloon") # true
我们已经研究了查找文本的方法,所以让我们看看如何用不同的文本替换该文本。
文字处理程序中的查找和替换功能可让您搜索字符串并将其替换为另一个字符串。您可以在 Ruby 中使用以下命令来做到这一点sub
and gsub
方法。
The sub
方法将字符串的一部分替换为另一个字符串。
萨米不再拥有气球了;它飞走了。让我们改变子字符串"has"
to "had"
.
balloon = "Sammy has a balloon"
print balloon.sub("has","had")
我们的输出将如下所示:
Ouput
Sammy had a balloon.
The sub
方法仅用新文本替换第一次出现的匹配项。让我们使用一个修改后的字符串,该字符串出现两次has
:
balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.sub("has","had")
Output
Sammy had a balloon. The balloon has a ribbon
只有第一次出现发生了变化。
要全部更改,请使用gsub
方法,该方法执行global代换:
balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.gsub("has","had")
Output
Sammy had a balloon. The balloon had a ribbon
The sub
and gsub
方法总是返回新字符串,而不修改原始字符串。让我们通过将字符串中的“balloon”更改为“boomerang”来演示这一点:
text = "Sammy has a balloon"
text.gsub("ballooon", "boomerang")
print text
Output
Sammy has a balloon
输出没有显示我们正在寻找的结果,因为虽然我们确实指定了替换,但我们从未分配过结果gsub
到一个新变量。为了得到我们想要的结果,我们可以像这样重写程序:
text = "Sammy has a balloon"
text = text.sub("ballooon", "boomerang")
print text
或者,您可以使用sub!
相反,它会修改原始字符串。让我们通过进行一些字符串替换来尝试一下。我们将“红色气球”更改为“蓝色回旋镖”:
text = "Sammy has a red balloon"
text.sub!("red", "blue")
text.sub!("balloon", "boomerang")
print text
Output
Sammy has a blue boomerang
您可以使用gsub!
方法也可以就地进行全局替换。
The sub
and gsub
方法接受常用表达对于搜索模式。让我们将字符串中的所有元音替换为@
symbol:
"Sammy has a red balloon".gsub(/[aeiou]/, "@")
"S@mmy h@s @ r@d b@ll@@n"
替换值不必是字符串。您可以使用散列来指定应如何替换单个字符或片段。让我们替换所有出现的字母a
with @
和所有的o
带零的字符:
"Sammy has a red balloon".gsub(/[aeiou]/, {"a" => "@", "o" => "0"})
# "S@mmy h@s @ rd b@ll00n"
您可以使用它以更少的代码执行更复杂的替换。
在本教程中,您使用字符串数据类型的一些内置方法来处理和操作字符串。您还了解到,许多处理字符串的方法有两种变体:一种使字符串保持不变,另一种修改原始字符串。
您使用哪一种取决于您的需要。 Ruby 使您可以灵活地选择如何处理数据。但是,编写不修改现有数据的代码可以更轻松地在以后进行调试。
请务必查看这些相关教程,以继续探索如何在 Ruby 中处理数据:
- 如何在 Ruby 中使用字符串
- 如何在 Ruby 中使用数组
- 了解 Ruby 中的数据类型
- 如何在 Ruby 中使用数组方法