names=tr_s!
visibility=public
kind=defined

--- tr_s!(pattern, replace) -> self | nil

文字列の中に pattern 文字列に含まれる文字が存在したら、
replace 文字列の対応する文字に置き換えます。さらに、
置換した部分内に同一の文字の並びがあったらそれを 1 文字に圧縮します。

pattern の形式は [[man:tr(1)]] と同じです。
つまり「a-c」は a から c を意味し、
"^0-9" のように文字列の先頭が「^」の場合は指定した文字以外が置換の対象になります。

replace でも「-」を使って範囲を指定できます。

  p "gooooogle".tr_s("a-z", "A-Z")   # => "GOGLE"

「-」は文字列の両端にない場合にだけ範囲指定の意味になります。
同様に、「^」もその効果は文字列の先頭にあるときだけです。
また、「-」、「^」、「\」はバックスラッシュ (「\」) でエスケープできます。

replace の範囲が search の範囲よりも小さい場合、
replace の最後の文字が無限に続くものとして扱われます。

tr_s は置換後の文字列を生成して返します。
tr_s! は self を変更して返しますが、
置換が起こらなかった場合は nil を返します。

注意:
一般に、tr_s! を tr! と squeeze! で置き換えることはできません。
tr! と squeeze! の組みあわせでは tr! の置換後の文字列全体を squeeze! しますが、
tr_s! は置換された部分だけを squeeze! します。
以下のコードを参照してください。

    str = "foo"
    str.tr_s!("o", "f")
    p str   # => "ff"

    str = "foo"
    str.tr!("o", "f")
    str.squeeze!("f")
    p str   # => "f"

@param pattern    置き換える文字のパターン
@param replace    pattern で指定した文字を置き換える文字

@see [[m:String#tr]], [[m:String#tr_s]]

