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