You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby正则表达式:匹配首尾数量相等的反引号代码块

Ruby正则匹配Markdown多数量反引号代码块解决方案

核心正则实现

针对Markdown代码块首尾符号数量一致的需求,Ruby中可使用带反向引用的正则实现:

/^[[:space:]]*([`~]{3,})(.*?)\1$/m

正则解析

  • ^[[:space:]]*:匹配代码块行首的任意空白字符(支持缩进写法)
  • ([~]{3,})`:捕获组1,匹配3个及以上的反引号或波浪线,后续通过`\1`反向引用保证首尾符号数量完全一致
  • (.*?):非贪婪匹配代码块内容,避免过度匹配到其他代码块的闭合符号
  • \1:反向引用捕获组1的内容,确保闭合符号与开头数量、类型完全匹配
  • /m:多行模式,使.可以匹配换行符,支持跨多行的代码块

关键优化点

  • 将原判断中固定的3个符号规则替换为{3,},完全兼容Markdown规范中"至少3个反引号/波浪线"的要求
  • 采用反向引用替代固定数量匹配,从根本解决"开头多符号、遇到3个就错误闭合"的问题
  • 加入行首空白支持,适配Markdown代码块的缩进场景
  • 同时兼容反引号和波浪线两种代码块标记

Ruby代码示例

# 测试用Markdown内容
markdown_text = <<~MD
  `````ruby
  puts "这是5个反引号开头的代码块"
  # 中间包含```也不会错误闭合
print("这是3个波浪线开头的代码块")

MD

匹配并处理代码块

code_block_regex = /^[[:space:]]([`~]{3,})(.?)\1$/m
processed_content = markdown_text.gsub(code_block_regex) do

示例:转换为HTML代码块,可替换为自定义处理逻辑

"

#{$2.strip}
"
end

puts processed_content

## 扩展支持(可选)
如果需要匹配带语言标记的代码块(如```ruby),可调整正则为:
```ruby
/^[[:space:]]*([`~]{3,})(\w+)?\s*(.*?)\1$/m

其中(\w+)?用于捕获语言类型,后续可通过$2获取该值实现语法高亮。

内容的提问来源于stack exchange,提问作者Yousef Marey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:50:04