给定字符串str
:
Normal P start
feed << feed_item.attributes.merge({
:photo_url => feed_item.user.cloudfront_url(:thumb),
:full_name => full_name,
:meta => '',
:embed_preview => embed_preview,
:embed_preview_meta => embed_data
})
Normal P end
我想将代码包装在<code><pre>
标记中,所以我有:
re = /((?:^(?:[ ]{4}|\t).*$(?:\r?\n|\z))+)/
str = str.gsub(re, "<pre><code>\n\\1\n</code></pre>")
问题是这会产生:
Normal P start
<pre><code>
feed << feed_item.attributes.merge({
:photo_url => feed_item.user.cloudfront_url(:thumb),
:full_name => full_name,
:meta => '',
:embed_preview => embed_preview,
:embed_preview_meta => embed_data
})
</code></pre>
Normal P end
如何避免在内部<code>
标记的顶部或底部显示空行?我还需要确保<code><pre>
和</code></pre>
在他们自己的行上没有其他任何内容?
答案 0 :(得分:0)
我假设您正在寻找的是:
Normal P start
<pre><code>
feed << feed_item.attributes.merge({
:photo_url => feed_item.user.cloudfront_url(:thumb),
:full_name => full_name,
:meta => '',
:embed_preview => embed_preview,
:embed_preview_meta => embed_data
})
</code></pre>
Normal P end
试试这个:
re = /\n*((?:^(?:[ ]{4}|\t).*$(?:\r?\n|\z))+)\n*/
str.gsub!(re, "\n<pre><code>\n\\1</code></pre>")
答案 1 :(得分:0)
唧唧(关于你的第一个gsub)
str.gsub!(/\n(\s*\n)+/, "\n")
答案 2 :(得分:0)
对于长正则表达式来说,这不是一个真正的问题。它可以使用它完成,但固定模式会使问题蒙上阴影:
html = <<EOT
feed << feed_item.attributes.merge({
:photo_url => feed_item.user.cloudfront_url(:thumb),
:full_name => full_name,
:meta => '',
:embed_preview => embed_preview,
:embed_preview_meta => embed_data
})
EOT
code = html.scan(/^ {4}.+/).join("\n")
formatted_code = "\n<pre><code>\n" + code + "\n</code></pre>\n"
puts html.sub(code, formatted_code)
将输出:
<pre><code>
feed << feed_item.attributes.merge({
:photo_url => feed_item.user.cloudfront_url(:thumb),
:full_name => full_name,
:meta => '',
:embed_preview => embed_preview,
:embed_preview_meta => embed_data
})
</code></pre>
代码正在查找以四个空格字符开头的行,并将它们作为数组返回,将它们与回车连接起来,然后用<pre><code>
块包装它们。
这不适用于多个非连续的缩进代码块,但只需稍加重新设计即可。
我们经常关注特定的解决方案并认为它必须以某种方式看待。正则表达式特别诱人。它们很快就会变得复杂,使它们难以维护。