介绍
Ruby 字符串有许多内置的方法,可以很容易地修改和处理文本,这是许多程序中的一项常见任务。
在本教程中,您将使用字符串方法来确定字符串的长度,索引和拆分字符串以提取子字符串,添加和删除空格和其他字符,更改字符串中字符的大小写以及查找和替换文本。 完成后,您可以将这些方法合并到您自己的程序中。
确定字符串长度
字符串方法length
返回字符串中的字符数。 此方法对于需要强制执行最小或最大密码长度或将较大的字符串截断为在缩写范围内的某些限制内时非常有用。
下面是一个打印句子长度的例子:
open_source = "Sammy contributes to open source."
print open_source.length
Output33
请记住,每个字符(包括字母,数字,空白字符和符号)都将被计数,因为它是字符串的一部分。
要检查一个字符串是否为空,你可以检查它的长度是否为0
,或者你可以使用empty?
方法:
name = ""
name.empty? # true
name = "Sammy"
name.empty? # false
name = " "
name.empty? # false
我们来看看如何索引字符串并访问字符串的内容。
访问字符串中的字符
要打印或使用字符串中的某些字符,请使用slice
方法获取您想要的部分。
像一样,每个元素对应一个索引号,每个字符串的字符也对应一个索引号,从索引号0开始。
对于字符串Sammy
,索引分解如下所示:
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
小号 | 一个 | 米 | 米 | ÿ |
slice
方法可以让您抓取单个字符或一系列字符。 传递一个整数将返回该索引处的字符。 传递两个用逗号分隔的整数,指示slice
将所有字符从第一个索引返回到最后一个索引(包含)。 slice
方法也接受一个范围,比如1..4
来指定要提取的字符:
"Sammy".slice(0) # "s"
"Sammy".slice(1,2) # "am"
"Sammy".slice(1..4) # "ammy"
[]
语法是slice
的别名,因此您可以将字符串视为数组:
"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
转换Sammy Shark
:
name = "Sammy Shark"
print name.upcase
OuputSAMMY SHARK
现在,我们将字符串转换为全部小写:
print name.downcase
Ouputsammy shark
upcase
和downcase
函数通过使得大小写始终一致来更容易地评估和比较字符串。 例如,如果您要求提供用户名,并且用户使用大写字母输入用户名,则可以将用户的输入小写,并将其与小写的已知值进行比较。
Ruby字符串也有一个capitalize
方法,返回一个新的字符串,其中第一个字符大写:
"sammy".capitalize # "Sammy"
这是一个方便的方法,但要小心你如何使用它; 它只是首字母大写,所以它可能并不总是适合你需要的用例。
Ruby还提供了一个swapcase
方法,它返回一个外壳交换的字符串:
text = "Sammy"
print text.swapcase
sAMMY
downcase
, upcase
, captalize
和swapcase
方法都返回一个新的字符串,并保持现有的字符串不变。 如果您要做的不是立即打印文本,请务必记住这一点。 看看下面的示例:
text = "sammy"
text.capitalize
print "Hello, #{text}!"
OutputHello, sammy!
即使我们调用了text
变量的capitalize
,我们也没有捕获到capitalize
返回的值。 我们需要重写这样的程序:
text = "sammy"
text = text.capitalize
print "Hello, #{text}!"
OutputHello, 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
chop
方法保持原始字符串不变,返回一个新的字符串。 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
方法更安全一些, 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
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
将其细化为字符所在的条目,然后将二维数组转换为索引的一维数组。
除了在字符串中查找字符外,还可以使用start_with?
来检查字符串是否以字符或子字符串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”是,所以返回值是true
。
你可以使用end_with?
方法来查看一个字符串是否以给定的子字符串结尾。 它的工作方式与start_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")
我们的输出将如下所示:
OuputSammy had a balloon.
sub
方法只是用新文本替换匹配的第一个发生。 让我们使用一个修改过的字符串,该字符串有两个出现的单词has
:
balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.sub("has","had")
OutputSammy had a balloon. The balloon has a ribbon
只有第一次发生变化。
要全部更改它们,请使用执行全局替换的gsub
方法:
balloon = "Sammy has a balloon. The balloon has a ribbon"
print balloon.gsub("has","had")
OutputSammy had a balloon. The balloon had a ribbon
sub
和gsub
方法总是返回新的字符串,而不修改原文。 让我们通过在我们的字符串中将“气球”更改为“飞旋镖”
text = "Sammy has a balloon"
text.gsub("ballooon", "boomerang")
print text
OutputSammy 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
OutputSammy 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"
您可以使用这个代码来执行更复杂的替换。
结论
在本教程中,您使用了字符串数据类型的一些内置方法来处理和操纵字符串。 您还了解到,处理字符串的许多方法有两种:一种是保持字符串不变,另一种是修改原始字符串。 你使用哪一个取决于你的需求。 Ruby为您提供了选择如何处理数据的灵活性。 但是,编写不修改现有数据的代码稍后可以更容易调试。
请务必查看这些相关教程,继续探索如何在Ruby中使用数据: