Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyでの文字のエスケープ

この投稿では、Rubyでの文字のエスケープについて説明します。いくつかのユースケースでは、文字をエスケープする方法、その仕組み、および完全にエスケープしないようにする方法を学習します。 \についてすべて知っていると思う場合 、必ずすべて読んで驚いてください...

文字列で文字をエスケープして、すぐに飛び込みましょう。

引用符のエスケープ

Rubyで文字列を使用する場合、文字列を定義するために使用した引用符を文字列自体の中に入れる必要がある場合があります。そうする場合、バックスラッシュ \を使用して引用符文字をエスケープできます。 シンボル。

# Escape quotes in double quoted strings
"Hello \"world\"!"
=> "Hello \"world\"!"
 
# Escape quotes in single quoted strings
'Hello \'world\'!'
=> "Hello 'world'!"

ここでは、Rubyがデフォルトで出力に二重引用符で囲まれた文字列を使用し、出力でそれらの二重引用符のみをエスケープしていることがわかります。

エスケープシーケンス

引用符のほかに、文字列でエスケープできる記号が他にもあります。たとえば、改行は \ nで表されます。 。これは「エスケープシーケンス」と呼ばれます。

"Hello\nworld"
=> "Hello\nworld"

返されるのは、作成したものと同じ文字列ですが、ご覧のとおり \ n が強調表示され、エスケープシーケンスであることを示します。この文字列を出力すると、リテラル \ nであることがわかります。 は印刷されませんが、代わりに実際の改行が印刷されます。

puts "Hello\nworld"
=> Hello
world

これは、一重引用符で囲まれた文字列では機能しません。 \n シーケンスはリテラルの\nとして解釈されます 。二重引用符で囲まれた文字列では、同じ結果を得るには円記号をエスケープする必要があります。

'\n'
=> "\\n"

同じように機能する他のエスケープシーケンスの例は次のとおりです。\t \ s および\b 、それぞれタブ、スペース、バックスペースを表します。

一重引用符vs および二重引用符

Rubyでの一重引用符で囲まれた文字列と二重引用符で囲まれた文字列の違いは、文字列定義がエスケープシーケンスを表す方法です。

  • ダブル 引用符で囲まれた文字列を使用すると、エスケープシーケンスを記述でき、Rubyはそれらの翻訳された意味を出力します。 \n 改行になります。
  • シングル ただし、引用符で囲まれた文字列はエスケープされ、リテラル定義を返します。 \n \nのまま 。

もちろん、どちらの文字列タイプにもユースケースがあります。エスケープシーケンスを含む二重引用符で囲まれた文字列を使用して、翻訳された意味、改行、またはタブを使用する可能性があります。

一重引用符は、エスケープシーケンス自体のエスケープを回避するのに役立ちます。それらの使用法を示したり、意図しないエスケープシーケンスを誤って使用したりしないようにするのに役立ちます。

puts "Line 1\nLine 2"
=> Line 1
Line 2
 
puts 'Using a \n we can indicate a newline.'
=> Using a \n we can indicate a newline.

エスケープ補間

Rubyは文字列内の補間をサポートしています。しかし、繰り返しになりますが、すべての文字列定義が同じように作成されるわけではありません。補間は二重引用符で囲まれた文字列でのみ機能します。

以下のコード例では、補間は二重引用符で囲まれた文字列で機能しますが、Rubyは補間シーケンスを単一引用符で囲まれた文字列でエスケープし、役に立たないことがわかります。

name = "world"
 
"Hello #{name}"
=> "Hello world"
 
'Hello #{name}'
=> "Hello \#{name}"

この動作は、ほぼすべての種類の文字列「魔法」に適用されます。二重引用符はそれをサポートしますが、一重引用符はサポートしません。

文字列のパーセント表記

Rubyのパーセント表記は、Perlプログラミング言語に触発されたものであり、いくつかの一般的な型定義の多くの省略形を提供します。

一重引用符と二重引用符で囲まれた文字列の同じ動作は、パーセント表記にも適用されます。

  • %() および%Q() 二重引用符で囲まれた文字列と同じように動作します。
  • %q() 一重引用符で囲まれた文字列と同じように動作します。

パーセント表記の問題は、括弧文字()をエスケープする必要があることです。 括弧のバランスが取れていない場合は、引用符の代わりに。

これが、Rubyでパーセント表記に他の記号も使用できる理由です:%[foo] %{foo} %-foo- %?foo? 、など。% "foo"もサポートします。 および%'foo'

ここでは、パーセント表記を使用すると、Rubyが文字列をエスケープしていることがわかります。

%(Hello "world"!)
=> "Hello \"world\""
 
# With unbalanced parenthesis
%(Hello world\)!)
=> "Hello world)!"
 
# With balanced parenthesis
%(Hello (world)!)
=> "Hello (world)!"

ここでも、通常の一重引用符と二重引用符で囲まれた文字列の場合と同じ規則が適用されます。エスケープシーケンスと補間は、デフォルトで一重引用符で囲まれた文字列でエスケープされます。

name = "world"
 
%(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"
 
%q(Hello\n "#{name}"!)
=> "Hello\\n \"\#{name}\"!"
 
%Q(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"

正規表現での文字のエスケープ

エスケープ文字は正規表現でも機能します。正規表現では、多くの文字が文字通りの定義以上のものを表します。

任意の文字のワイルドカードであり、角かっこ [] 範囲または選択を表し、括弧() 式などに一致します。リテラル定義を使用するために、バックスラッシュ記号でエスケープすることもできます。

/Hello \[world\]/
=> /Hello \[world\]/
 
/\[world\]/ =~ "Hello [world]"
=> 6

角かっこをエスケープしなかった場合は、代わりに角かっこの間の文字を検索し、文字 lの最初の一致を見つけます。 位置3の「こんにちは」で

/[world]/ =~ "Hello [world]"
=> 2 # zero index

スラッシュ記号/をエスケープする必要がないようにするため 、正規表現を定義するために使用され、別のパーセント表記を使用できます。

%r{/world/}
=> /\/world\//

%r {}を使用する スラッシュをエスケープする必要がない正規表現を定義できます。結果として、Rubyがスラッシュをエスケープしていることがわかります。

改行のエスケープ

以前は、「改行」エスケープシーケンスをエスケープしました \ n Rubyの文字列で。 Ruby自体で改行をエスケープすることもできることをご存知ですか?

たとえば、メソッド呼び出しの行が非常に長いため、コードスタイルガイドの最大行長が壊れます。

ruby_method_with_many_arguments "Hello world", split: " ", join: "\n"

引数を別々の行に配置して、個々の行を短くすることができます。これは、前の行がコンマで終わっている限り機能します 、プラス記号 +などの演算子 、または括弧で囲まれたメソッド呼び出しの一部()

ruby_method_with_many_arguments "Hello world",
  split: " ",
  join: "\n"
 
ruby_method_with_many_arguments(
  "Hello world",
  split: " ",
  join: "\n"
)

代わりに、すべての引数を括弧で囲まずに同じインデントレベルに揃えたい場合は、() バックスラッシュ\を使用できます 改行をエスケープします。

ruby_method_with_many_arguments \
  my_string,
  split: " ",
  join: "\n"

ここで行うことは、Rubyに改行をエスケープするように実際に指示しているのではなく、ステートメントが次の行に続くことです。

文字列定義での改行のエスケープ

行末のエスケープは、文字列定義などでも機能します。通常、複数行の文字列がある場合は、プラス記号 +を使用できます。 2行の文字列を結合します。

"foo" +
  "bar"
=> "foobar"

これにより、2行に2つの文字列が作成され、1つに結合されます。したがって、実際には3つの文字列オブジェクトが作成されます。

プラス記号を使用する代わりに、バックスラッシュを使用して改行をエスケープできます。

"foo" \
  "bar"
=> "foobar"

結果は同じですか、それともそうですか?

最初の例では、実際には2つの新しい文字列を組み合わせていますが、2番目の例では、Rubyは1つだけを作成します。 Rubyインタープリターにはバックスラッシュ\が表示されます 文字列定義の続きとして、2行に基づいて1つの文字列のみを作成します。したがって、アプリのメモリ使用量にはさらに優れています。

結論

Rubyや他の多くのプログラミング言語で文字をエスケープすると、かなり混乱する可能性があります。突然、文字の特定の組み合わせは、単一引用符で囲まれた文字列内で使用される場合とは、二重引用符で囲まれた文字列内で異なる意味を持ちます。

この小さなガイドが、Rubyで文字やシーケンスを適切にエスケープする方法を理解するのに役立つことを願っています。ここでは、二重引用符で囲まれた文字列と一重引用符で囲まれた文字列の違いが重要です。

エスケープシーケンスと補間の文字列「魔法」は、実際には二重引用符で囲まれた文字列でのみ機能し、一重引用符で囲まれた文字列では機能しません。

Ruby自体でコードをエスケープする他の方法もあります。パーセント表記は、文字列や正規表現で特定の文字を常にエスケープすることを回避するのに役立ちます。

ただし、バックスラッシュは、複数行の文字列を記述したり、次の行にRubyコードの行を続けたりする場合にも非常に役立ちます。コードをクリーンで読みやすくするためによく使用するもの。

詳細を知りたい場合、またはRubyでの文字のエスケープについて具体的な質問がある場合は、@AppSignalまでお知らせください。

楽しい補足:Markdownで書かれたこの投稿では、バックスラッシュ記号をかなり多く使用する必要がありました。 Rubyと同様に、Markdownでは特定の文字をエスケープできます。通常、Markdownでは、バックスラッシュがコードブロック自体をエスケープするため、バックスラッシュをコードブロックでラップすることはできません。代わりに、スペースをエスケープしてもらいました。

`\` # Doesn't work
`\ ` # Works :)

  1. JavaScriptで文字をエスケープする

    エスケープ文字は、意図したものとは別の方法で解釈できる文字です。これらの文字をそのまま印刷するには、それらの前に円記号「\」を含めます。以下はJavaScriptのエスケープ文字です- コード 結果 \ b バックスペース \ f フォームフィード \ n 改行 \ r キャリッジリターン \ t 水平タブレーター \ v 垂直タブレーター \ 一重引用符 \ 二重引用符 \\ バックスラッシュ 以下は、javaScriptでエスケープ文字のバックスラッシュを実装するコードで

  2. JavaScriptを使用してアクセント付き文字を含む文字列を並べ替える方法は?

    以下は、JavaScriptでアクセント付き文字を含む文字列を並べ替えるコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style&g