-2

次のような文字列があります。

Frank's Red Hot

そして、アポストロフィを削除してスペースをアンダースコアに置き換える正規表現が必要なので、次のようになります。

franks_red_hot

全て小文字にすればおまけですが、その機能は既にあるので必要ありません。

4

6 に答える 6

5

それを行う方法は複数あります

これはさまざまな方法で行うことができます。ただし、問題を引き起こす他の考慮事項がない場合は、多くの場合、インテントのコーディングが最善の方法だと思います。個人的には、次のことをお勧めします。

"Frank's Red Hot".downcase.delete(?').tr ' ', ?_
#=> "franks_red_hot"

これにより、予期しない場所で nil を返す可能性のあるメソッド チェーン内の bang メソッドが回避されます。また、そのスタイルのコーディングを好む場合は、簡単に分解したり、複数の bang メソッドに変換したりできます。

中間値のコーディング

中間値が気になる場合、またはコードをデバッグする必要がある場合は、いつでも bang メソッドを複数行で使用できます。これも、メソッド チェーン内の bang メソッドを回避します。例えば:

str = %q{Frank's Red Hot}
#=> "Frank's Red Hot"

str.downcase!
#=> "frank's red hot"

str.delete! ?'
#=> "franks red hot"

str.tr! ' ', ?_
#=> "franks_red_hot"

この手法は確かにデバッグが容易ですが、明らかに冗長です。YMMV。

于 2013-11-04T21:48:16.743 に答える
1
s = "Frank's Red Hot"
p s.tr(' ','_').delete("'").downcase #=>"franks_red_hot"
于 2013-11-04T21:01:07.307 に答える
1

本当に正規表現が必要ですか? これは必要に応じて機能するはずです。

string.downcase.gsub("'", '').gsub(' ', '_')
于 2013-11-04T20:58:22.933 に答える
1
"Frank's Red Hot".downcase!.gsub!("'","").gsub!(" ","_")

質問する前に、オブジェクトのドキュメントを読んでみてください。

于 2013-11-04T20:59:01.687 に答える
1

String#gsub使用しているバージョンに応じて、正規表現を使用して部分文字列と一致させながら、置換パラメーターに使用してハッシュを実装できます。

str.downcase.gsub(/[' ]/, ' ' => '_')
# => franks_red_hot

ブロックでの使用:

re = { ' ' => '_' }
x  = str.downcase.gsub /[' ]/ do |match|
   re[match.to_s]
 end

マップの使用:

map = { "'" => '', ' ' => '_' }
re  = Regexp.union(map.keys)
x = str.downcase.gsub(re, map)
于 2013-11-04T21:16:03.250 に答える