如何使用正则表达式修剪空行?

时间:2012-01-17 22:20:54

标签: ruby regex

给定字符串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>在他们自己的行上没有其他任何内容?

3 个答案:

答案 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>块包装它们。

这不适用于多个非连续的缩进代码块,但只需稍加重新设计即可。

我们经常关注特定的解决方案并认为它必须以某种方式看待。正则表达式特别诱人。它们很快就会变得复杂,使它们难以维护。