配列 - Rubyで複数行インデントされた文字列を簡単に処理する方法はありますか?




プログラミング 空白行 (3)

"|" YAMLでは、字下げできる複数行の文字列を作成することができます。 空白は、最初の行の最初の空白以外の文字の後の列にある場合にのみカウントされます。 このようにして、インデントを持つ複数行の文字列を作成できますが、コード内でインデントされています。

require 'yaml'

1.times do
  doc = YAML::load(<<-EOM)
  |

     <html>
       <head>
         <title>
           Title
         </title>
       </head>
       <body>
         Body
       </body>
     </html>  
  EOM
  ans = "Your document: %s" % [doc]
  puts ans
end

私は、私のルビーコードでひどく印刷されたhtmlコードの非常に大きなブロックをインラインで処理したいとします。 文字列内の書式を失うことなく、あるいは何らかのgsub正規表現を覚えていなくても、これを行う最もクリーンな方法は何ですか?

1行にすべてエンコードするのは簡単ですが、読みにくいです:

1.times do
  # Note that the spaces have been changed to _ so that they are easy to see here.
  doc = "\n<html>\n__<head>\n____<title>\n______Title\n____</title>\n__</head>\n__<body>\n____Body\n__</body>\n</html>\n"
  ans = "Your document: %s" % [doc]
  puts ans
end

Rubyの複数行のテキストは読みやすくなりますが、文字列は残りのコードで字下げできません:

1.times do
  doc = "
<html>
  <head>
    <title>
      Title
    </title>
  </head>
  <body>
    Body
  </body>
</html>
"
  ans = "Your document: %s" % [doc]
  puts ans
end

たとえば、次のコードは私のコードで字下げされていますが、文字列にはすべての行の前に4つの余分なスペースがあります:

1.times do
  doc = <<-EOM

    <html>
      <head>
        <title>
          Title
        </title>
      </head>
      <body>
        Body
      </body>
    </html>
  EOM
  ans = "Your document: %s" % [doc]
  puts ans
end

ほとんどの人は上記のHEREDOCコードを使い、結果の正規表現を置き換えて各行の先頭に余分な空白を取り除きます。 私は毎回正規表現の手間を経なくてもいい方法が欲しい。


Ruby 2.3以降、主要なコンテンツの空白を除去する<<~ heredoc:

def make_doc(body)
  <<~EOF
  <html>
    <body>
      #{body}
    </body>
  </html>
  EOF
end

puts make_doc('hello')

古いRubyのバージョンでは、以下は、他の回答に示されている解決策よりも冗長ですが、パフォーマンスのオーバーヘッドはほとんどありません。 1つの長い文字列リテラルと同じくらい速いです:

def make_doc(body)
  "<html>\n"       \
  "  <body>\n"     \
  "    #{body}\n"  \
  "  </body>\n"    \
  "</html>"
end

string = %q{This
    is
        indented
  and
    has
         newlines}

Here%q{}%Q{}などのいくつかの例があるブログがあります。

覚えやすいのであれば、「引用符」は「Q」と考えてください。

Sidenote:技術的には、引用を行う際に「q」は必要ありません。

string = %{This
   also
      is indented
  and
     has
   newlines
      and handles interpolation like 1 + 1 = #{1+1}
}

ただし、 %Q{}を使用するのがベストプラクティスであり、読みやすくなります。







string