0Pricing
Ruby Academy · 课时

匹配与捕获

match 与捕获内容

匹配与捕获 是 CoddyKit 上的免费 Ruby Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Ruby Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Ruby Academy 课程共包含 4 节课。

MatchData 对象

调用 regex.match(string) 时,如果成功,Ruby 会返回一个 MatchData 对象;如果失败,则返回 nil。

MatchData 保存匹配的文本以及捕获的组。

m = /world/.match('hello world')
puts m.class
puts(m[0])

完整匹配:索引 0

MatchData 的索引 0 始终表示完整的匹配子字符串,与是否存在其他组无关。

m = /\d+/.match('order 4521 shipped')
puts(m[0])
puts(m.to_s)

捕获组

圆括号 ( ) 会创建捕获组。每个组都可以通过从 1 开始的编号访问。

m = /(\d{4})-(\d{2})/.match('2026-05')
puts(m[1])
puts(m[2])

captures 方法

captures 会返回所有捕获组组成的数组(不包括索引 0 处的完整匹配)。

m = /(\w+)@(\w+)/.match('alice@example')
p m.captures

解构捕获结果

由于 captures 返回数组,因此您可以直接将结果解构到变量中。

user, host = /(\w+)@(\w+)/.match('bob@server').captures
puts user
puts host

匹配前后的文本

MatchData 提供了用于获取匹配项周围文本的辅助功能:

  • pre_match 匹配项之前的部分
  • post_match 匹配项之后的部分
m = /\d+/.match('abc123xyz')
puts(m.pre_match)
puts(m.post_match)

使用 scan 查找所有匹配项

String#scan 会返回字符串中的每一个匹配项组成的数组,而不仅仅是第一个。

nums = '12 cats, 8 dogs, 3 birds'.scan(/\d+/)
p nums

使用 scan 和捕获组

如果您的模式包含组,scan 会返回一个由数组组成的数组,每个匹配项对应一个数组,其中包含该匹配项的捕获结果。

pairs = 'a=1 b=2 c=3'.scan(/(\w)=(\d)/)
p pairs

安全处理空值

请始终记住,如果没有任何匹配,match 会返回 nil。在使用结果前,请先对这种情况进行保护。

m = /(\d+)/.match('no digits here')
if m
  puts m[1]
else
  puts 'no match found'
end

特殊变量

成功匹配后,Ruby 会设置全局变量:$~ 是 MatchData,而 $1、$2 是编号捕获结果。

它们在简短脚本中很方便,但在实际代码中,明确使用 MatchData 会更清晰。

if 'name: Alice' =~ /name: (\w+)/
  puts $1
end

提取日期

结合使用组和捕获结果,即可一步从字符串中提取结构化数据。

year, month, day = /(\d{4})-(\d{2})-(\d{2})/.match('2026-05-29').captures
puts "Year #{year}, Month #{month}, Day #{day}"

快速检查

给定 'a=1 b=2'.scan(/(\w)=(\d)/),结果的结构是什么?

回顾:匹配与捕获

现在您可以从匹配结果中提取数据:

  • match 返回 MatchData 或 nil
  • 索引 0 是完整匹配,1 及以上是捕获组
  • captures 以数组形式返回所有组
  • scan 查找字符串中的所有匹配项
  • 始终对 nil 进行保护
p 'x1 y2 z3'.scan(/([a-z])(\d)/)

常见问题解答

「匹配与捕获」课时是免费的吗?

是的 — 「匹配与捕获」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ruby Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ruby Academy 课程共包含 4 节课。

「匹配与捕获」这节课中我会学到什么?

match 与捕获内容 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Ruby Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Ruby Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「匹配与捕获」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Ruby Academy 课中编写并运行代码吗?

能。每节 Ruby Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 正则表达式字面量
  2. 匹配与捕获
  3. 替换
  4. 命名组与锚点
← 返回 Ruby Academy