Как убрать ведущие и конечные кавычки из строки, в Ruby - PullRequest
34 голосов
/ 11 августа 2010

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

  • "foo,bar"
  • "foo,bar
  • foo,bar"
  • foo,bar

Ответы [ 9 ]

36 голосов
/ 11 августа 2010

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

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

Как указано в комментариях ниже, лучшее решение:

s.gsub!(/\A"|"\Z/, '')
32 голосов
/ 11 августа 2010

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Начиная с Ruby 2.5, rchomp(x) доступен под именем delete_prefix, а chomp(x) доступен как delete_suffix, что означает, что вы можете использовать

'"foo,bar"'.delete_prefix('"').delete_suffix('"')
23 голосов
/ 11 августа 2010

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

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

9 голосов
/ 29 января 2013

Другой подход будет

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?хорошо читаются.

3 голосов
/ 19 июля 2014

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

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"
2 голосов
/ 20 марта 2018

Я хотел то же самое, но для косых черт в пути 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('"')
0 голосов
/ 10 апреля 2017

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

'"foo"bar"'.scan(/"(.*)"/)[0][0]
# => "foo\"bar"
0 голосов
/ 08 июля 2016

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

'"foo,bar"'.delete('"')
0 голосов
/ 07 апреля 2014

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

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...