介绍
Ruby strings具有许多内置的方法,可以轻松修改和操纵文本,这是许多程序中常见的任务。
在本教程中,您将使用字符串方法来确定字符串的长度,索引和分割字符串来提取字符串,添加和删除白色空间和其他字符,更改字符串中的情况,并找到和替换文本。
定义字符串长度
字符串方法长度
返回字符串中的字符数. 此方法对于需要强制执行最小或最大密码长度或缩小较大的字符串以在某些限制范围内使用作为缩写时是有用的。
以下是打印一个句子的长度的例子:
1open_source = "Sammy contributes to open source."
2print open_source.length
1[secondary_label Output]
233
请记住,每个字符,包括字母,数字,白色空间字符和符号,都将被计算,因为它是字符串的一部分。
若要检查字符串是否空,可以检查字符串的长度是否为0
,也可以使用空
方法:
1name = ""
2name.empty? # true
3
4name = "Sammy"
5name.empty? # false
6
7name = " "
8name.empty? # false
让我们看看如何索引字符串并访问字符串的内容。
在 string 中访问字符
若要打印或使用字符串中的某些字符,请使用片段
方法获取您想要的部分。
例如 arrays,每一个元素都与一个索引数相匹配,一个字符串的每个字符也与一个索引数相匹配,从索引数0开始。
对于字符串Sammy
,索引分布看起来像这样:
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
S | a | m | m | y |
slice
方法允许您抓取单个字符或字符串。 通过单个整数返回该索引的字符。 通过两个整数,分隔一个字符串,告诉 slice
返回从第一个索引到最后一个索引的所有字符,包括。
1"Sammy".slice(0) # "s"
2"Sammy".slice(1,2) # "am"
3"Sammy".slice(1..4) # "ammy"
[]
语法是slic
的代名词,因此您可以将字符串视为数组:
1"Sammy"[0] # "s"
2"Sammy"[1,2] # "am"
3"Sammy"[1..4] # "ammy"
您也可以从字符串的末尾访问一个单个字符以负索引。 -1
允许您访问字符串的最后一个字符, -2
允许您访问第二到最后一个字符,等等。
最后,您可以使用车辆
方法将字符串转换为一个字符串:
1"sammy".chars # ["S", "a", "m", "m", "y"]
这可以用于操纵或转换字符的字符串。
接下来,让我们看看如何在字符串中改变字符的案例。
转换为上部和下部案例
upcase
和 downcase
方法会返回一个字符串,其中原始字符串的所有字母都被转换为上级或下级字母。
让我们将字符串Sammy Shark
转换为所有上面的案例:
1name = "Sammy Shark"
2print name.upcase
1[secondary_label Ouput]
2SAMMY SHARK
现在,让我们将字符串转换为所有较低的案例:
1print name.downcase
1[secondary_label Ouput]
2sammy shark
upcase
和 downcase
函数使评估和比较字符串变得更容易,通过使整个字符串保持一致性. 例如,如果您要求用户名,并且用户用大写字母输入用户名,您可以降低用户的输入字符串,并将其与已知的字符串值进行比较。
Ruby 字符串也有一个资本化
方法,该方法返回一个新的字符串,第一个字符被资本化:
1"sammy".capitalize # "Sammy"
这是一个方便的方法,但要小心你如何使用它;它只利用第一个字母,所以它可能并不总是适合你需要的使用案例。
Ruby 还提供了一种交换箱
方法,该方法会返回带有交换箱的字符串:
1text = "Sammy"
2print text.swapcase
1sAMMY
所有downcase
、upcase
、captalize
和swapcase
方法都返回一个新的字符串,并将现有的字符串保持不变。
1text = "sammy"
2text.capitalize
3
4print "Hello, #{text}!"
1[secondary_label Output]
2Hello, sammy!
虽然我们在文本
变量上称为资本化
,但我们从未捕捉到资本化
返回的值。
1text = "sammy"
2text = text.capitalize
3
4print "Hello, #{text}!"
1[secondary_label Output]
2Hello, Sammy!
您可以使用downcase!
、upcase!
、capitalize!
和swapcase!
来更改原始字符串:
1text = "sammy"
2text = text.capitalize!
3
4print "Hello, #{text}!"
但是要小心,原始字符串的突变有缺点,Ruby提供了这两种方法,所以你可以选择一个适合你的需求。
现在让我们从字符串中添加和删除白空间。
Padding 和 Stripping 弦
如果您正在编写一个必须格式化某些文本的程序,您通常会发现您需要在字符串前面、后面或周围添加一些空间,以使其与其他数据保持一致。
若要用空格围绕一个字符串,请使用中心
方法:
1"Sammy",center(21) # " Sammy "
如果要使用不同的字符,您可以指定一个字符串作为第二个参数:
1" [Sammy] ".center(21, "<>") # "<><><> [Sammy] <><><>"
ljust
和rjust
方法将空格或字符添加到字符串的左侧或右侧,并与中心
方法完全相同:
1"Sammy".ljust(20) # "Sammy "
2"Sammy".rjust(20) # " Sammy"
3"Sammy".rjust(20, "!") # "!!!!!!!!!!!!!!!Sammy"
若要从字符串中删除带领空间,请使用rstrip
方法。 若要删除带领空间,请使用lstrip
来删除带领空间和带领空间:
1" Sammy".rstrip # "Sammy"
2"Sammy ".lstrip # "Sammy"
3" Sammy ".strip # "Sammy"
您可以使用中心!
、ljust!
、rjust!
、lstrip!
、rstrip!
和strip!
方法来修改原始字符串。
有时你需要从字符串的尽头删除字符,Ruby的chop
方法只是这样;它从字符串中删除最后一个字符:
1"Sammy".chop # "Samm"
这对于从字符串中删除新行字符(\n
)尤其有用:
1"This string has a newline\n".chop
chop
方法将原始字符串保持不变,返回一个新的字符串. chop!
方法将现有字符串更改。
chomp
方法可以从字符串的末尾删除多个字符:
1"Sammy".chomp("my") # "Sam"
如果您没有指定要删除的字符串,‘chomp’将删除新行:
1"This string has a newline\n".chomp # "This string has a newline
但是,如果字符串不包含新行字符,则chomp
只会返回原始字符串:
1"Sammy".chomp # "Sammy"
这使得chomp
在删除新闻稿时比chop
方法更安全,它总是删除最后一个字符。
Ruby 有一个chomp!
方法,它会改变原始字符串并返回修改字符串,如果它执行了更换,但是,与chomp
不同,如果它没有改变字符串,则chomp!
方法会返回nil
:
1string = "Hello\n"
2string.chomp! # "Hello"
3
4string = "Hello"
5string.chomp! # nil
接下来,让我们看看如何在字符串中搜索文本。
寻找字符和文本
有时你需要确定一个字符串是否包含另一个字符串。
「包括」方法會檢查一個字符串是否包含另一個字符串,如果字符串存在,則會返回「真」,如果不是,則會返回「假」。
1"Sammy".include?("a") # true
2"Sammy".include?("b") # false
该索引
方法返回一个字符的索引,还可以识别一个字符串的第一个字符串的索引,如果这个字符或字符串不存在,则返回零
:
1"Sammy".index("a") # 1
2"Sammy".index("mm") # 2
3"Sammy".index("Fish") # nil
虽然索引
方法只会找到第一个发生,但这里有一个较长的字符串的例子:
1text = "Sammy has a balloon"
2text.index("a") # 1
Sammy has a balloon
字符串有a
字母的四个发生,但index
只找到第一个发生。
例如,您可以将字符串转换为字符串,然后使用 数组方法重复结果并选择该字符的索引。
1text = "Sammy has a balloon"
2indices = text.chars
3.each_with_index
4.select{|char, index| char == "a" }
5.map{|pair| pair.last}
6
7print indices
1[1, 7, 10, 13]
each_with_index
返回一个包含每个字符和其索引的二维数组。 select
将其转换为只有字符为 a
的条目,而 map
将两维数组转换为一个单维数组的索引。
除了在字符串中搜索字符之外,您还可以检查字符串是否使用 start_with?
方法以字符串或子串开始:
1text = "Sammy has a balloon"
2text.start_with?("s") # true
3text.start_with?("Sammy has" # true
start_with?
方法接受多个字符串,如果其中任何一个字符串匹配,则返回 true:
1text = "Sammy has a balloon"
2text.start_with?("Sammy the Shark", "Sammy") # true
在本示例中,没有找到Sammy the Shark
,但Sammy
是,因此返回值为true
。
您可以使用 end_with?
方法来查看一个字符串是否与给定的字符串结束. 它就像 start_with?
:
1text = "Sammy has a balloon"
2text.end_with?("balloon") # true
3text.end_with?("boomerang") # false
4text.end_with?("boomerang", "balloon") # true
我们已经研究了如何找到文本,所以让我们看看如何用不同的文本代替该文本。
在字符串中替换文本
在文本处理器中找到和替换功能允许您搜索一个字符串并用另一个字符串替换它,您可以在Ruby中使用sub
和gsub
方法做到这一点。
子
方法用另一个代替一个字符串的一部分。
萨米已经没有气球了,它飞走了,让我们把字符串有
改为有
。
1balloon = "Sammy has a balloon"
2print balloon.sub("has","had")
我们的产出将是这样的:
1[secondary_label Ouput]
2Sammy had a balloon.
sub
方法只会用新文本取代对应的第一个发生,让我们使用一个有两个发生的ha
单词的修改字符串:
1balloon = "Sammy has a balloon. The balloon has a ribbon"
2print balloon.sub("has","had")
1[secondary_label Output]
2Sammy had a balloon. The balloon has a ribbon
只有第一个事件改变了。
要更改它们,请使用gsub
方法,该方法执行 global 替换:
1balloon = "Sammy has a balloon. The balloon has a ribbon"
2print balloon.gsub("has","had")
1[secondary_label Output]
2Sammy had a balloon. The balloon had a ribbon
sub
和gsub
方法总是返回新的字符串,留下原始字符串不变.让我们通过在我们的字符串中改变气球
为boomerang
来证明这一点:
1text = "Sammy has a balloon"
2text.gsub("ballooon", "boomerang")
3print text
1[secondary_label Output]
2Sammy has a balloon
输出不会显示我们正在寻找的结果,因为虽然我们确实指定了替换,但我们从未将gsub
的结果分配给一个新的变量。
1text = "Sammy has a balloon"
2text = text.sub("ballooon", "boomerang")
3print text
或者,你可以使用sub!
来更改原来的字符串,让我们尝试做几个字符串更换,我们将红色气球
更改为蓝色蓬马兰
:
1text = "Sammy has a red balloon"
2text.sub!("red", "blue")
3text.sub!("balloon", "boomerang")
4print text
1[secondary_label Output]
2Sammy has a blue boomerang
您也可以使用gsub!
方法进行全球替换。
sub
和gsub
方法接受搜索模式的 常规表达式。
1"Sammy has a red balloon".gsub(/[aeiou]/, "@")
1"S@mmy h@s @ r@d b@ll@@n"
替换值不必是一个字符串. 您可以使用一个哈希来指定单个字符或片段应该如何被替换. 让我们把字母a
的所有发生都用@
和所有o
字符用零代替:
1"Sammy has a red balloon".gsub(/[aeiou]/, {"a" => "@", "o" => "0"})
2# "S@mmy h@s @ rd b@ll00n"
您可以使用此功能以更少的代码执行更复杂的替代。
结论
在本教程中,您使用了一些用于字符串数据类型的内置方法来工作和操纵字符串,您还了解到,许多用字符串工作的方法有两种变体:一种使字符串保持不变,另一种则修改原始字符串。
您使用的代码取决于您的需求。Ruby为您提供了选择您想要如何处理数据的灵活性。
请务必查看这些相关教程,以继续探索如何在Ruby中使用数据: