Как мне обрезать пустые строки с помощью регулярных выражений? - PullRequest
1 голос
/ 18 января 2012

Учитывая строку 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
")

Проблема в том, что тогда это дает:

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
        })
Нормальный конец P

Как можно избежать пустых строк вверху или внизу внутреннего тега <code>?нужно убедиться, что <code><pre> и находятся на своей собственной линии без чего-либо еще?

Ответы [ 3 ]

0 голосов
/ 18 января 2012

Хоу об этом (после вашего первого gsub)

str.gsub!(/\n(\s*\n)+/, "\n")
0 голосов
/ 18 января 2012

Это не проблема для длинных регулярных выражений. Это можно сделать с помощью этого, но фиксация на шаблоне затуманивает проблему:

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
\ п» помещает html.sub (код, 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
    })

Код ищет строки, начинающиеся с четырех пробелов и возвращающие их в виде массива, соединяя их с возвратами каретки, затем заключая их в блоки <pre><code>.

Это не будет работать с несколькими несмежными блоками кода с отступом, но с небольшим изменением структуры.

Слишком часто мы зацикливаемся на конкретном решении и думаем, что оно должно выглядеть определенным образом. Регулярные выражения особенно соблазнительны. Они очень быстро усложняются, что затрудняет их обслуживание.

0 голосов
/ 18 января 2012

Я предполагаю, что вы ищете:

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
        })
Нормальный конец P

Попробуйте:

re = /\n*((?:^(?:[ ]{4}|\t).*$(?:\r?\n|\z))+)\n*/
str.gsub!(re, "\n<pre><code>\n\\1
")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...