字符串内部
学习如何访问字符串中的各个元素。
集合
集合是一个通用术语,用于将多个值组合成一个整体。我们在现实生活中经常使用集合——一本书是页面的集合,一列火车是车厢的集合,一个衣柜是衣物的集合。
字符串
字符串是由字符组成的集合,通常被视为一个单一单元。它用于存储诸如姓名、地址、消息等文本值。
初始化字符串
在 Ruby 中有多种方式可以初始化字符串。以下程序演示了这些方法:
1String1 = 'String1 in Single Quotes \' not "' 2print(String1,"\n") 3 4String2 = "String2 in Double Quotes \" not '" 5print(String2,"\n") 6 7String3 = '''String3 in Three Single Quotes: neither \' nor "''' 8print(String3,"\n") 9 10String4 = '''String4 Three quotes 11 allow 12 multi-line''' 13print(String4,"\n")
上面代码中有一些新内容需要理解。以下是初始化字符串变量的三种方法:
- 第1行:
String1的文本用单引号'包裹。在此类字符串中,可以直接添加",而'可以通过反斜杠\转义后加入。 - 第4行:
String2的文本用双引号"包裹。在此类字符串中,可以直接添加',而"可以通过反斜杠\转义后加入。 - 第7行:
String3和String4的文本用三个单引号'''包裹。在此类字符串中,可以直接添加",而'可以通过反斜杠\转义后加入。 - 最后一种方法还便于将多行文本赋值给字符串变量,如
String4的第10至12行所示。其他两种方法无法实现这一点。
访问字符串中的字符
Ruby 允许我们通过整数索引来访问字符串中的单个字符。方法是在字符串变量名后用方括号包裹索引数字,如下程序所示:
1String1 = "Educative" 2print(String1,"\n") 3 4print(String1[0],'=',String1[-9],"\n") # 显示字符串的第一个字符 5print(String1[1],'=',String1[-8],"\n") # 显示字符串的第二个字符 6print(String1[2],'=',String1[-7],"\n") # 显示字符串的第三个字符 7print(String1[3],'=',String1[-6],"\n") # 显示字符串的第四个字符 8print(String1[4],'=',String1[-5],"\n") # 显示字符串的第五个字符 9print(String1[5],'=',String1[-4],"\n") # 显示字符串的第六个字符 10print(String1[6],'=',String1[-3],"\n") # 显示字符串的第七个字符 11print(String1[7],'=',String1[-2],"\n") # 显示字符串的第八个字符 12print(String1[8],'=',String1[-1],"\n") # 显示字符串的第九个字符
上述代码逐行显示字符串的各个字符。第一个字符位于索引 0,索引沿字符串线性递增。Ruby 还支持负索引。最后一个字符位于 -1 索引,索引沿字符串线性递减,如下图所示:
切片
切片是从字符串中提取的一段字符子集。我们使用 [i..f] 语法指定要访问的起始和结束索引。有多种方式获取字符串切片,但必须同时提供两个值:
- 使用
...,如[i...f],表示从索引i到f-1的切片(不包含f)。 - 使用
..,如[i..f],表示从索引i到f的切片(包含f)。 - 使用逗号分隔两个值,如
[i, n],表示从索引i开始取n个字符的切片。
以下代码展示了多种切片方式,并演示了如何通过切片和连接(使用 + 操作符合并两个字符串)修改字符串中的单个字符。
1String1 = "Educative" 2print("\n第3到第5个索引之间的字符: ") 3print(String1[3...5],"\n") 4print("\n第3个索引到倒数第3个索引之间的字符: ") 5print(String1[3...-3],"\n") 6 7String1[9]='-' 8print(String1,"\n") 9 10String2 = String1 + ' Learner' 11print(String2,"\n") 12 13String3 = String2[0...10] + '-' + String2[11..-1] 14print(String3,"\n")
在上述代码中:
String1[3...5]中,范围...的起始索引为3,结束索引为5。该切片包含两个字符ca,位于索引3和4(在索引5前停止),因为...不包含右端点。String1[3...-3]中,范围...的起始索引为3,结束索引为-3。该切片包含三个字符cat,位于索引3、4和5(在索引-3或6前停止)。- 两个字符串可以通过
+操作符连接,如String2所示。 - 可以直接通过切片修改任意索引位置的字符,如
String1[9] = '-'。也可以通过切片和连接的方式修改字符,如String3所示。[0...10]表示从字符串开头到索引10-1的切片,[11..-1]表示从索引11到字符串末尾的切片。可以在赋值左侧使用String2代替String3。
字符串操作练习
以下是几个用于练习 Ruby 字符串操作的示例程序。点击“显示答案”按钮可查看解决相应问题的程序。你可以将给出的解决方案复制粘贴到代码编辑器中,以确保你的输出与示例一致。编程中可能存在多种正确的解决方案。
逆序打印字符
编写一个程序,逐行显示字符串中的字符,顺序为从后往前。字符串长度限制为九个字符。
示例输入
1"Educative"
示例输出
1e 2v 3i 4t 5a 6c 7u 8d 9E
1string = "Educative" 2# 请在此处编写代码。
你可以在上方的代码编辑器中运行以下代码:
1string = "Educative" 2print(string[-1],"\n") 3print(string[-2],"\n") 4print(string[-3],"\n") 5print(string[-4],"\n") 6print(string[-5],"\n") 7print(string[-6],"\n") 8print(string[-7],"\n") 9print(string[-8],"\n") 10print(string[-9],"\n")
在上述程序中:
- 我们使用变量
string存储文本"Educative"。 - 我们使用负索引逐个显示
string的字符,顺序为从后往前。 - 此任务也可以通过正索引实现。
左移字符串中的字符
编写一个程序,将字符串中的字符向左移动一位,并将最后一个位置替换为句点。
示例输入
1myString = "Educative"
示例输出
1ducative.
提示: 使用切片和连接。
1# 请在此处编写代码。 2myString = "Educative" 3myString = myString[1...]+"." 4print(myString,"\n")
你可以在上方的代码编辑器中运行以下代码:
1myString = "Educative" 2myString = myString[1...]+"." 3print(myString,"\n")
在上述程序中:
- 我们使用变量
myString存储文本"Educative"。 - 我们通过切片
myString[1...]将字符向左移动,并通过连接+"."在变量末尾添加句点。 - 我们显示
myString的更新值。
反转字符串
编写一个程序,将字符串内容反转后存储到另一个字符串中。字符串长度限制为九个字符。
示例输入
1"Educative"
示例输出
1evitacudE
1myString1 = "Educative" 2# 请在此处编写代码。
你可以在上方的代码编辑器中运行以下代码:
1myString1 = "Educative" 2myString2 = "" 3myString2 += myString1[-1] 4myString2 += myString1[-2] 5myString2 += myString1[-3] 6myString2 += myString1[-4] 7myString2 += myString1[-5] 8myString2 += myString1[-6] 9myString2 += myString1[-7] 10myString2 += myString1[-8] 11myString2 += myString1[-9] 12print(myString2)
在上述程序中:
- 我们使用变量
myString1存储文本"Educative"。 - 我们使用另一个变量
myString2存储空字符串""。 - 我们从
myString1的最后一个字符(索引-1)开始,依次将其添加到myString2,直到索引-9。 - 我们显示
myString2的更新值。
回文测试
回文是指正读和反读都相同的字符序列。编写一个程序,判断一个字符串是否为回文。字符串长度限制为五个字符。
示例输入 1
1"level"
示例输出 1
1Palindrome
示例输入 2
1"leve"
示例输出 2
1Not Palindrome
1string = "level" 2# 请在此处编写代码。
你可以在上方的代码编辑器中运行以下代码:
1string = "level" 2 3if string[0] == string[-1] and string[1] == string[-2] 4 print("Palindrome","\n") 5else 6 print("Not Palindrome","\n") 7end
在上述代码中:
- 我们使用变量
string存储文本"level"。 - 我们比较字符串的第一个字符与最后一个字符,再比较第二个字符与倒数第二个字符,作为条件表达式。
- 如果条件为真,则输出
Palindrome,否则输出Not Palindrome。