0Pricing
Ruby Academy · 课时

命名组与锚点

高级正则表达式

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

为什么使用命名组

当模式变得复杂时,像 m[1] 这样的编号捕获结果会变得难以阅读。命名组可以为每个捕获结果提供有意义的标签。

语法:(?<name>pattern)。

m = /(?<year>\d{4})-(?<month>\d{2})/.match('2026-05')
puts(m[:year])
puts(m[:month])

访问命名捕获结果

使用符号或字符串键访问命名捕获结果:m[:name]。named_captures 方法会以哈希表形式返回所有命名捕获结果。

m = /(?<user>\w+)@(?<host>\w+)/.match('alice@mail')
p m.named_captures

将命名组与 =~ 配合使用

当带有命名组的正则表达式字面量出现在 =~ 的左侧时,Ruby 会自动为每个名称创建局部变量。

if /(?<word>\w+)/ =~ 'hello'
  puts word
end

锚点:开头与结尾

锚点匹配的是位置,而不是字符:

  • ^ 行首
  • $ 行尾

要验证整个输入是否匹配,锚点至关重要。

puts(/^abc/.match?('abcdef'))
puts(/def$/.match?('abcdef'))
puts(/^abc$/.match?('abcdef'))

字符串锚点 \A 和 \z

^ 和 $ 匹配行边界,这对于多行字符串很重要。对于整个字符串,请优先使用 \A(开头)和 \z(真正的末尾)。

text = "first\nsecond"
puts(/^second/.match?(text))
puts(/\Asecond/.match?(text))

验证完整输入

要检查整个字符串是否符合某种格式,请固定两端的边界。这样可以拒绝包含额外字符的字符串。

zip = /\A\d{5}\z/
puts(zip.match?('34000'))
puts(zip.match?('34000x'))

单词边界

\b 是单词边界:单词字符与非单词字符之间的位置。它可以匹配完整单词,而不会消耗字符。

puts('cat catalog'.scan(/\bcat\b/).length)
puts('cat catalog'.scan(/cat/).length)

前瞻

正向前瞻 (?=...) 会断言后续内容,但不会将其包含在匹配结果中。负向前瞻是 (?!...)。

puts('100 dollars'.match(/\d+(?= dollars)/)[0])
puts('apple pie'.match?(/apple(?! juice)/))

后顾

后顾 (?<=...) 会断言匹配项之前的内容。负向后顾是 (?<!...)。

m = '$42'.match(/(?<=\$)\d+/)
puts(m[0])

非捕获组

有时您需要使用分组来实现分支选择或量词,但不希望捕获内容。请使用 (?:...) 创建非捕获组。

m = /(?:Mr|Ms)\. (\w+)/.match('Ms. Lee')
p m.captures

综合运用

实际的验证器会结合使用锚点、命名组和量词。

re = /\A(?<area>\d{3})-(?<num>\d{4})\z/
m = re.match('555-1234')
puts(m[:area])
puts(m[:num])

快速检查

要确保整个字符串都匹配,同时忽略换行符,应该使用哪些锚点?

回顾:命名组与锚点

您已经掌握了高级正则表达式工具:

  • 命名组 (?<name>...) 和 named_captures
  • 锚点 ^ $ \A \z \b
  • 前瞻 (?=) / (?!) 和后顾 (?<=) / (?<!)
  • 非捕获组 (?:...)
puts(/\A(?<id>\d+)\z/.match('42')[:id])

常见问题解答

「命名组与锚点」课时是免费的吗?

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

「命名组与锚点」这节课中我会学到什么?

高级正则表达式 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Ruby Academy 需要有经验吗?

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

「命名组与锚点」课时需要多长时间?

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

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

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

此课程中的所有课时

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