Подтвердить что ты не робот

Как разбить ведущую и конечную цитату из строки, в Ruby

Я хочу удалить ведущие и завершающие кавычки в Ruby из строки. Символ кавычки будет иметь значение 0 или 1 раз. Например, все следующее должно быть преобразовано в foo, bar:

  • "foo,bar"
  • "foo,bar
  • foo,bar"
  • foo,bar
4b9b3361

Ответ 1

Вы также можете использовать функцию chomp, но, к сожалению, она работает только в конце строки, предполагая, что есть обратная chomp, вы можете:

'"foo,bar"'.rchomp('"').chomp('"')

Реализация rchomp проста:

class String
  def rchomp(sep = $/)
    self.start_with?(sep) ? self[sep.size..-1] : self
  end
end

Обратите внимание, что вы также можете сделать это inline, с немного менее эффективной версией:

'"foo,bar"'.chomp('"').reverse.chomp('"').reverse

EDIT: Поскольку Ruby 2.5, rchomp(x) доступен под именем delete_prefix, а chomp(x) доступен как delete_suffix, что означает, что вы можете использовать

'"foo,bar"'.delete_prefix('"').delete_suffix('"')

Ответ 2

Я могу использовать gsub для поиска главной или конечной цитаты и заменить ее пустой строкой:

s = "\"foo,bar\""
s.gsub!(/^\"|\"?$/, '')

Как предложено ниже, лучшее решение:

s.gsub!(/\A"|"\Z/, '')

Ответ 3

Как обычно, все захватывают регулярное выражение из инструментария.: -)

В качестве альтернативы я порекомендую посмотреть .tr('"', '') (AKA "translate" ), который в этом использовании действительно лишает кавычки.

Ответ 4

Другой подход

remove_quotations('"foo,bar"')

def remove_quotations(str)
  if str.start_with?('"')
    str = str.slice(1..-1)
  end
  if str.end_with?('"')
    str = str.slice(0..-2)
  end
end 

Это без RegExps и start_with?/End_with? хорошо читаемы.

Ответ 5

Это расстраивает меня, что полоса работает только в пробеле. Мне нужно снять все виды персонажей! Здесь расширение строки, которое будет исправлять:

class String
  def trim sep=/\s/
    sep_source = sep.is_a?(Regexp) ? sep.source : Regexp.escape(sep)
    pattern = Regexp.new("\\A(#{sep_source})*(.*?)(#{sep_source})*\\z")
    self[pattern, 2]
  end
end

Выход

'"foo,bar"'.trim '"'         # => "foo,bar"
'"foo,bar'.trim '"'          # => "foo,bar"
'foo,bar"'.trim '"'          # => "foo,bar"
'foo,bar'.trim '"'           # => "foo,bar"

'  foo,bar'.trim             # => "foo,bar"
'afoo,bare'.trim /[aeiou]/   # => "foo,bar"

Ответ 6

Я хотел то же самое, но для косой черты в URL-адресе, который может быть /test/test/test/ (так, чтобы он имел зачищающие символы посередине) и в итоге придумал что-то вроде этого, чтобы избежать регулярных выражений:

'/test/test/test/'.split('/').reject(|i| i.empty?).join('/')

Что в этом случае явно означает:

 '"foo,bar"'.split('"').select{|i| i != ""}.join('"')

или же

'"foo,bar"'.split('"').reject{|i| i.empty?}.join('"')

Ответ 7

Regexs могут быть довольно тяжелыми и приводить к некоторым фанки-ошибкам. Если вы не имеете дело с массивными строками, и данные довольно однородны, вы можете использовать более простой подход.

Если вы знаете, что строки имеют стартовые и ведущие кавычки, вы можете объединить всю строку:

string  = "'This has quotes!'"
trimmed = string[1..-2] 
puts trimmed # "This has quotes!"

Это также можно превратить в простую функцию:

# In this case, 34 is \" and 39 is ', you can add other codes etc. 
def trim_chars(string, char_codes=[34, 39])
    if char_codes.include?(string[0]) && char_codes.include?(string[-1])
        string[1..-2]
    else
        string
    end
end

Ответ 8

Предполагая, что кавычки могут появляться только в начале или конце, вы можете просто удалить кавычки all без специального метода:

'"foo,bar"'.delete('"')

Ответ 9

Вы можете снять необязательные кавычки с помощью scan:

'"foo"bar"'.scan(/"(.*)"/)[0][0]
# => "foo\"bar"