5

の引数として引用符で囲まれた単一の文字列リテラル内のバックスラッシュのエスケープステータスについて、私には不思議なことがありますString#tr。以下の3つの例の対比を説明できますか?私は特に2番目のものを理解していません。複雑さを避けるために、ここでは二重引用符( = )'d'でエスケープしても意味が変わらないものを使用しています。"\d""d"

'\\'.tr('\\', 'x')      #=> "x"
'\\'.tr('\\d', 'x')     #=> "\\"
'\\'.tr('\\\d', 'x')    #=> "x"
4

1 に答える 1

9

逃げるtr

の最初の引数はtr、正規表現での角かっこ文字のグループ化とよく似ています。式の先頭で使用^して、一致を否定し(一致しないものはすべて置き換えます)、たとえばa-f、文字の範囲を一致させるために使用できます。制御文字があるため、内部でエスケープすることもできるので、リテラル文字として使用でき-ます^

print 'abcdef'.tr('b-e', 'x')  # axxxxf
print 'abcdef'.tr('b\-e', 'x') # axcdxf

Ruby一重引用符文字列でのエスケープ

さらに、一重引用符を使用する場合、Rubyは可能な場合、つまり、別の円記号または一重引用符を実際にエスケープするために使用されていない場合に、円記号を含めようとします。

# Single quotes
print '\\'    # \
print '\d'    # \d
print '\\d'   # \d
print '\\\d'  # \\d

# Double quotes
print "\\"    # \
print "\d"    # d
print "\\d"   # \d
print "\\\d"  # \d

例の再検討

これらすべてを念頭に置いて、例をもう一度見てみましょう。

'\\'.tr('\\', 'x')      #=> "x"

として定義された文字列は、最初の円記号が2番目の円記号をエスケープするため、'\\'リテラル文字列になります。\そこに驚きはありません。

'\\'.tr('\\d', 'x')     #=> "\\"

として定義され'\\d'た文字列は、リテラル文字列になります\d。次にtr、エンジンはリテラル文字列のバックスラッシュを使用して。をエスケープしdます。結果:のインスタンスをxtrに置き換えます。d

'\\'.tr('\\\d', 'x')    #=> "x"

として定義された文字列'\\\d'はリテラルになり\\dます。最初\\はになり\ます。次に、に\dなり\dます。つまり、円記号は保持されます。(この特定の動作は、バックスラッシュが生きたまま食べられ、寂しいだけを残す二重文字列とは異なりますd

\\d次に、リテラル文字列trは、バックスラッシュまたは置換文字列のいずれかであるすべての文字を置換しdます。

于 2011-05-08T09:30:01.003 に答える