如何在Ruby中使用字符串方法
简介
在 Ruby 中,字符串拥有许多内置方法,使得修改和操作文本变得简单。这在许多程序中是一项常见任务。
在这个教程中,你将使用字符串方法来确定字符串的长度,索引和分割字符串以提取子字符串,添加和删除空格和其他字符,改变字符串中字符的大小写,以及查找和替换文本。完成后,你将能够将这些方法应用到你自己的程序中。
确定字符串长度
字符串方法 length 返回字符串中字符的数量。当你需要强制最小或最大的密码长度,或者将较长的字符串截断以便在缩写中使用时,此方法非常有用。
这是一个打印句子长度的例子。
open_source = "Sammy contributes to open source."
print open_source.length
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
SAMMY SHARK
现在,让我们把字符串转换为全小写:
print name.downcase
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}!"
Hello, sammy!
尽管我们调用了capitalize函数对文本变量进行处理,但是我们从来没有获取到capitalize返回的值。我们需要像这样重写程序:
text = "sammy"
text = text.capitalize
print "Hello, #{text}!"
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")
我们的输出将会是这样的:
Sammy had a balloon.
sub方法只会替换第一个与匹配项相符的内容,将其替换为新的文本。让我们使用一个修改过的字符串,其中包含两个“has”单词的出现次数。
balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.sub("has","had")
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")
Sammy had a balloon. The balloon had a ribbon
sub和gsub方法始终返回新的字符串,原始字符串保持不变。让我们通过将字符串中的“balloon”更改为“boomerang”来证明这一点。
text = "Sammy has a balloon"
text.gsub("ballooon", "boomerang")
print text
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
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