命名组与锚点
高级正则表达式
命名组与锚点 是 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 反馈 — 无需本地设置。