2016-08-23 8 views
1

私は "example .png"と "example 2.png"という名前を持っています。私はスペースを "_"に変換しようとしています。削除する必要があります。"。"の前にスペースを見つける方法

これまでのところ私はこのようにそれをやっている:

file.gsub(" .",".").gsub(" ", "_").gsub(".tif", "") 
+0

'.'は正規表現の中の特殊文字です。 – tadman

答えて

1

rstrip PED File.basename(filename,File.extname(filename))を使用してextnameを追加し、その中の下線とスペースを置き換える:

File.basename(filename,File.extname(filename)).rstrip.gsub(" ", "_") + File.extname(filename) 

Ruby demo

を参照してください。

詳細

  • File.basename(filename,File.extname(filename)) - 拡張
  • .rstripせずにファイル名を取得 - 拡張
  • .gsub(" ", "_")前に空白を削除 - ファイル拡張子 - アンダースコア
  • File.extname(filename)で(任意の空白を削除する/\s+/正規表現を使用)、スペースを置き換えます。あなたが正規表現の方法を好む場合

s = 'some example 2 .png' 
puts s.gsub(/\s+(\.[^.]+\z)|\s/) { 
    Regexp.last_match(1) ? 
     Regexp.last_match(1) : 
     "_" 
} 

can be shorteneds.gsub(/\s+(\.[^.]+\z)|\s/) { $1 || "_" }に(参照Jordan's remark))。 this Ruby demoを参照してください。ここ

、パターンが一致した:

  • \s+(\.[^.]+\z)から1又はそれ以上の空白(\s+)を拡張する前に、(\.[^.]+ - ドット列\zの終了前にドット以外1+文字が続きます)または
  • \s - - は、グループ1
  • |に拡張子をキャプチャしているときならば、他の空白記号が(それの後+を追加します空白のチャンク全体をアンダースコアに置き換える必要があります)。

ブロックでは、グループ1をテストするためのチェックが実行され、一致する場合は、結果に拡張子のみが挿入されます。そうでなければ、空白はアンダースコアに置き換えられます。

+0

もっと簡潔に 's.gsub(/.../){$ 1 || "_"} '。 –

+0

@Jordan:はい、論理は同じです:グループ1か、一致しない場合は - を使用して置換します。 –

+0

はい...そういうわけで私はその旨のコメントを投稿しました。 –

関連する問題