1. 什么是字符串?
字符串是一系列字符的集合,用单引号 '
或双引号 "
包裹。Ruby 的字符串默认编码是 UTF-8,支持中文、日文等语言。
基本定义
str1 = "你好,世界!"
str2 = 'Ruby'
puts str1 # 你好,世界!
puts str2 # Ruby
单引号 vs 双引号
- 双引号:支持插值(
#{}
)和转义(如\n
)。 - 单引号:更严格,插值和转义无效。
name = "张三"
puts "你好,#{name}!" # 你好,张三!
puts '你好,#{name}!' # 你好,#{name}!
puts "换行\n测试" # 换行
# 测试
puts '换行\n测试' # 换行\n测试
2. 创建字符串的其他方式
多行字符串
用 <<-END
或 %Q
:
# heredoc 方式
text = <<-END
这是一个多行字符串。
支持中文和换行。
END
puts text
# %Q 方式
text2 = %Q(你好\n这是一个测试)
puts text2
输出:
这是一个多行字符串。
支持中文和换行。
你好
这是一个测试
符号转字符串
sym = :hello
puts sym.to_s # "hello"
3. 字符串操作
连接
str = "你" + "好"
puts str # 你好
greeting = "你好,"
greeting << "世界" # 修改原字符串
puts greeting # 你好,世界
插值
age = 25
puts "我今年 #{age} 岁" # 我今年 25 岁
puts "2 + 3 = #{2 + 3}" # 2 + 3 = 5
长度
text = "你好,Ruby"
puts text.length # 7(字符数)
puts text.bytesize # 13(字节数,中文占 3 字节)
puts text.empty? # false
4. 常用方法
大小写转换
str = "Hello, 你好"
puts str.upcase # HELLO, 你好(中文不变)
puts str.downcase # hello, 你好
puts str.capitalize # Hello, 你好
切片
text = "你好,世界"
puts text[0] # 你
puts text[0..1] # 你好
puts text[-1] # 界
puts text.slice(2, 3) # ,世
分割与合并
str = "苹果,香蕉,橙子"
fruits = str.split(",")
puts fruits # ["苹果", "香蕉", "橙子"]
puts fruits.join(" 和 ") # 苹果 和 香蕉 和 橙子
替换
text = "你好,世界"
puts text.gsub("世界", "Ruby") # 你好,Ruby
puts text.sub("好", "好吗") # 你好吗,世界(只替换第一个)
修剪
str = " 你好 "
puts str.strip # 你好
puts str.lstrip # 你好
puts str.rstrip # 你好
检查
text = "你好,世界"
puts text.include?("世界") # true
puts text.start_with?("你") # true
puts text.end_with?("界") # true
5. 字符串的编码
默认编码
str = "你好"
puts str.encoding # UTF-8
转换编码
str = "你好".encode("GBK")
puts str.encoding # GBK
puts str.encode("UTF-8") # 你好(转回 UTF-8)
处理乱码
# 假设从 GBK 文件读取
text = "你好".encode("GBK")
fixed = text.force_encoding("GBK").encode("UTF-8")
puts fixed # 你好
6. 中文支持示例
处理中文字符串
text = "你好,世界!"
puts text[0..1] # 你好
puts text.length # 6
puts text.reverse # !界世,好你
puts text.split(",") # ["你好", "世界!"]
实践案例
class Greeting
def initialize(name)
@name = name
end
def say
"你好,#{@name}!今天是 #{Time.now.strftime("%Y年%m月%d日")}"
end
end
g = Greeting.new("张三")
puts g.say # 你好,张三!今天是 2025年03月22日
7. 字符串的不可变性与修改
普通方法
大多数方法返回新字符串,不修改原字符串:
text = "你好"
new_text = text.upcase
puts text # 你好
puts new_text # 你好
破坏性方法(带 !
)
修改原字符串:
text = "你好"
text.upcase!
puts text # 你好(中文不变)
str = "hello"
str.upcase!
puts str # HELLO
8. 实践案例
案例 1:姓名解析
def parse_name(full_name)
parts = full_name.split
"姓:#{parts[0]},名:#{parts[1]}"
end
puts parse_name("张 三") # 姓:张,名:三
案例 2:文本清理
def clean_text(text)
text.strip.gsub(/\s+/, " ")
end
dirty = " 你好 世界 "
puts clean_text(dirty) # 你好 世界
案例 3:简单加密
def simple_encrypt(text)
text.chars.map { |c| (c.ord + 1).chr }.join
end
puts simple_encrypt("你好") # 伱倝
9. 注意事项
- 编码:处理中文时确保文件和终端使用 UTF-8。
- 性能:频繁拼接字符串时,
<<
比+
更高效(+
创建新对象)。 - 不可变性:注意区分普通方法和
!
方法的效果。
下一步
- 练习:告诉我你想用字符串做什么(分割、替换等),我可以设计一个例子。
- 问题解答:对字符串用法有疑问吗?直接问我!
- 深入学习:想了解正则表达式与字符串的结合或性能优化吗?我可以继续讲解。
你现在想做什么?写代码、问问题,还是其他?
发表回复