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
相关产品推荐
相关产品推荐

