2016-08-23 2 views
1

У меня есть имена «пример .png» и «пример 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(" ", "_") - заменяет пробелы (используйте /\s+/ регулярное выражение, чтобы удалить пробельные) с подчеркиванием
  • File.extname(filename) - расширение файла.

Если вы предпочитаете регулярки пути:

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

(can be shortened к s.gsub(/\s+(\.[^.]+\z)|\s/) { $1 || "_" } (см Jordan's remark)). См. this Ruby demo.

Здесь шаблон совпадает:

  • \s+(\.[^.]+\z) - 1 или более пробелов (\s+) перед расширением (\.[^.]+ - точка с последующим 1+, отличных от точки до конца строки символов \z), в то время как захватывая расширение в группе 1
  • | - или
  • \s - любой другой символ пробела (добавить + после этого, если вам необходимо заменить целые кусочки пробела символами подчеркивания).

В блоке gsub выполняется проверка для проверки группы 1, и при ее согласовании в результат вставляется только расширение. В противном случае пробел заменяется символом подчеркивания.

+0

Более кратко: 's.gsub (/.../) {$ 1 || "_"} '. –

+0

@ Джордан: Да, логика остается прежней: либо группа 1, либо - если она не сопоставлена ​​- используйте замену '_'. –

+0

Да ... вот почему я опубликовал комментарий к этому вопросу. –

Смежные вопросы