如何在Ruby中使用字符串方法

简介

在 Ruby 中,字符串拥有许多内置方法,使得修改和操作文本变得简单。这在许多程序中是一项常见任务。

在这个教程中,你将使用字符串方法来确定字符串的长度,索引和分割字符串以提取子字符串,添加和删除空格和其他字符,改变字符串中字符的大小写,以及查找和替换文本。完成后,你将能够将这些方法应用到你自己的程序中。

确定字符串长度

字符串方法 length 返回字符串中字符的数量。当你需要强制最小或最大的密码长度,或者将较长的字符串截断以便在缩写中使用时,此方法非常有用。

这是一个打印句子长度的例子。

open_source = "Sammy contributes to open source."
print open_source.length
Output

33

请记住,每个字符,包括字母、数字、空格字符和符号,都将被计算在内,因为它们是字符串的一部分。

要检查一个字符串是否为空,你可以检查它的长度是否为0,或者你可以使用empty?方法。

name = ""
name.empty? # true

name = "Sammy"
name.empty? # false

name = " "
name.empty? # false

让我们来看看如何对字符串进行索引并访问其内容。

访问字符串中的字符

使用切片方法来获取想要的字符串部分,以打印或处理字符串中的某些字符。

与数组类似,字符串的每个字符也对应一个索引号,从索引号0开始计数。

对于字符串”Sammy”,索引的分解如下所示:

0 1 2 3 4
S a m m y

切片方法允许您获取一个字符或一系列字符。传递一个整数会返回该索引处的字符。传递两个用逗号分隔的整数,告诉切片方法返回从第一个索引到最后一个索引(包括)的所有字符。切片方法还接受范围,如1..4,以指定要提取的字符。

"Sammy".slice(0) # "s"
"Sammy".slice(1,2) # "am"
"Sammy".slice(1..4) # "ammy"

[]语法是对切片的别名,因此您可以将字符串当作数组处理。

"Sammy"[0] # "s"
"Sammy"[1,2] # "am"
"Sammy"[1..4] # "ammy"

你也可以通过负索引从字符串末尾访问单个字符。-1代表字符串的最后一个字符,-2代表倒数第二个字符,依此类推。

最后,您可以使用chars方法将字符串转换为字符数组。

"sammy".chars # ["S", "a", "m", "m", "y"]

这对于操作或转换字符串中的字符可能很有用。

接下来,让我们看一下如何改变字符串中字符的大小写。

转换为大写和小写

upcase和downcase方法返回一个字符串,其中包含原始字符串中所有字母转换为大写或小写字母。字符串中的任何非字母字符都不会被改变。

让我们将字符串”Sammy Shark”转换为全部大写:

name = "Sammy Shark"
print name.upcase
Ouput

SAMMY SHARK

现在,让我们把字符串转换为全小写:

print name.downcase
Ouput

sammy shark

upcase和downcase函数通过将字符串的大小写统一,使得字符串的评估和比较更加简便。例如,如果要求用户输入用户名,并且用户输入的用户名首字母大写,你可以将用户的输入转换为小写形式,然后与一个已知的小写值进行比较。

在Ruby中,字符串也有一个capitalize方法,用于将第一个字符变为大写,并返回一个新的字符串。

"sammy".capitalize # "Sammy"

这是一种方便的方法,但要注意如何使用它;它只将首字母转为大写,可能不适合你所需要的用例。

Ruby还提供了一个swapcase方法,该方法返回一个大小写交换的字符串。

text = "Sammy"
print text.swapcase
sAMMY

下面定义的downcase、upcase、capitalize和swapcase方法都返回一个新的字符串,原字符串保持不变。如果你想做的不仅仅是立即打印出文本,这一点非常重要。请看下面的例子。

text = "sammy"
text.capitalize

print "Hello, #{text}!"
Output

Hello, sammy!

尽管我们调用了capitalize函数对文本变量进行处理,但是我们从来没有获取到capitalize返回的值。我们需要像这样重写程序:

text = "sammy"
text = text.capitalize

print "Hello, #{text}!"
Output

Hello, Sammy!

你可以使用 downcase!、upcase!、capitalize! 和 swapcase! 来修改原始字符串。

text = "sammy"
text = text.capitalize!

print "Hello, #{text}!"

要小心,虽然变异原始字符串有其不利之处。Ruby 提供了两种方法,你可以根据自己的需要选择其中之一。

现在让我们对字符串进行添加和删除空格的操作。

填充和删除字符串

如果你要编写一个需要格式化文本的程序,你经常会发现你想在字符串前面、后面或周围添加一些空格,以使其与其他数据对齐。而另一些时候,你可能想从字符串的开头或结尾删除不必要的字符,如额外的空格或特殊字符。

使用center方法来在字符串周围添加空格。

"Sammy",center(21) # " Sammy "

如果你想使用不同的字符,你可以将字符串作为第二个参数指定。

" [Sammy] ".center(21, "<>") # "<><><> [Sammy] <><><>"

ljust和rjust方法在字符串的左侧或右侧添加空格或字符,并且与center方法的工作方式完全相同。

"Sammy".ljust(20) # "Sammy "
"Sammy".rjust(20) # " Sammy"
"Sammy".rjust(20, "!") # "!!!!!!!!!!!!!!!Sammy"

要从字符串中去除前导空格,可以使用 rstrip 方法。要去除尾随空格,请使用 lstrip。使用 strip 方法可以同时去除前导和尾随空格。

" Sammy".rstrip # "Sammy"
"Sammy ".lstrip # "Sammy"
" Sammy ".strip # "Sammy"

你可以使用center!、ljust!、rjust!、lstrip!、rstrip!和strip!方法来修改原始字符串。

有时候你需要从一个字符串的结尾删除一些字符。Ruby的chop方法就是做这个的;它会从字符串中删除最后一个字符。

"Sammy".chop # "Samm"

这对于从字符串中删除换行符(\n)特别有用。

"This string has a newline\n".chop

切割方法不改变原始字符串,返回一个新的字符串。切割!方法直接修改现有的字符串。

“chomp” 方法可以从字符串的末尾删除多个字符。

"Sammy".chomp("my") # "Sam"

如果您没有指定要删除的字符串,chomp函数将会删除换行符。

"This string has a newline\n".chomp # "This string has a newline

然而,如果字符串中不包含换行符,chomp只会返回原始字符串。

"Sammy".chomp # "Sammy"

这使得使用 chomp 方法比 chop 方法更安全,因为它仅移除换行符,而后者总是移除最后一个字符。

Ruby有一个chomp!方法,它会改变原始字符串并返回修改后的字符串,如果进行了替换的话。然而,与chomp不同的是,如果chomp!方法没有改变字符串,它会返回nil。

string = "Hello\n"
string.chomp! # "Hello"

string = "Hello"
string.chomp! # nil

接下来,让我们来看看如何在字符串中搜索文本。

寻找字符和文本

有时候你需要判断一个字符串是否包含另一个字符串。

include? 方法用来检查一个字符串是否包含另一个字符串。如果字符串存在则返回 true,否则返回 false。

"Sammy".include?("a") # true
"Sammy".include?("b") # false

index 方法返回字符的索引。它还可以识别子字符串的第一个字符的索引。如果字符或子字符串不存在,则返回 nil。

"Sammy".index("a") # 1
"Sammy".index("mm") # 2
"Sammy".index("Fish") # nil

索引方法只能找到第一次出现的实例。以下是一个使用较长字符串的示例:

text = "Sammy has a balloon"
text.index("a") # 1

“Sammy有一个气球” 这个字符串中有四个字母“a”的出现。但是索引(函数)仅找到了第一次出现的位置。你需要写一些更具体的指令来定位其他出现之一。

例如,您可以将字符串转换为字符数组,并使用数组方法遍历结果并选择字符的索引。下面是一种实现方法:

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 的元素, 而 map 则将二维数组转换为一维数组,只包含索引。

除了在字符串中查找字符之外,您可以使用start_with?方法来检查字符串是否以字符或子字符串开头。

text = "Sammy has a balloon"
text.start_with?("s") # true
text.start_with?("Sammy has" # true

start_with? 方法接受多个字符串作为参数,如果其中任何一个与之匹配,则返回 true。

text = "Sammy has a balloon"
text.start_with?("Sammy the Shark", "Sammy") # true

在这个例子中,“Sammy the Shark”没有被找到,但是“Sammy”被找到了,所以返回值为真。

你可以使用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和gsub方法来实现这个功能。

sub 方法用另一个字符串替换字符串的一部分。

Sammy 不再有气球了, 它飞走了。我们将 “has” 修改为 “had”。

balloon = "Sammy has a balloon"
print balloon.sub("has","had")

我们的输出将会是这样的:

Ouput

Sammy had a balloon.

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方法,该方法执行全局替换。

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

sub和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!方法来进行全局替换。

sub和gsub方法接受用于搜索模式的正则表达式。让我们用@符号替换字符串中的所有元音字母。

"Sammy has a red balloon".gsub(/[aeiou]/, "@")
"S@mmy h@s @ r@d b@ll@@n"

替换值不必为字符串。您可以使用哈希来指定如何替换单个字符或片段。让我们将所有出现的字母a替换为@,并将所有的o字符替换为零。

"Sammy has a red balloon".gsub(/[aeiou]/, {"a" => "@", "o" => "0"})
# "S@mmy h@s @ rd b@ll00n"

您可以使用此功能进行更复杂的替换操作,代码量更少。

结论 (Jié

请注意:这个结论很重要。 : .)

在本教程中,您使用一些字符串数据类型的内置方法来处理和操作字符串。您还了解到,许多处理字符串的方法都有两个版本:一个不改变原字符串的,一个修改原字符串的。

取决于你的需求,你可以使用哪种取决于你的需求。Ruby可以让你在处理数据时选择不同的方式,提供了极大的灵活性。然而,编写不修改现有数据的代码,以后调试可能会更容易一些。

请务必查看这些相关的教程,以继续探索如何在 Ruby 中处理数据。

  • How To Work with Strings in Ruby
  • How To Work with Arrays in Ruby
  • Understanding Data Types in Ruby
  • How To Use Array Methods in Ruby
发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds