Ruby如何用gsub通过正则匹配为指定内容行添加blockquote包裹标签
错误原因分析
你写的gsub代码没有生效,核心有两个问题:
- gsub第一个参数传入字符串时,Ruby会做普通文本的精确匹配,不会把
^>.*识别为正则语法,所以无法匹配到目标行 - 替换内容中引用匹配结果的符号错误,Ruby中使用
\0指代全匹配结果,而不是/0
方案1:单行单独包裹blockquote(实现简单)
直接把第一个参数改为正则字面量,添加多行匹配修饰符,即可为每一行>开头的内容单独套标签:
wrap_in_blockquote = replace_backticks2.gsub(/^> (.*)$/, '<blockquote>\1</blockquote>')
你可以配合CSS设置blockquote的上下边距,让连续的引用视觉上是一个整体。
方案2:连续引用行合并为同一个blockquote(符合预期效果)
如果要实现把连续的>开头的行合并到一个blockquote标签内,用以下代码即可:
wrap_in_blockquote = replace_backticks2.gsub(/^>.*(?:\n>.*)*/m) do |match| content = match.gsub(/^> /, '') "<blockquote>#{content}</blockquote>" end
这段代码会先识别所有连续的引用行作为一个匹配块,再逐行移除开头的> 标记,最后统一包裹blockquote标签,输出结果和你给出的预期效果完全一致。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

