2010-08-10 2 views
31

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

  • "foo,bar"
  • "foo,bar
  • foo,bar"
  • foo,bar
+0

"[ask]" и "[mcve]" являются хорошими показаниями. –

ответ

28

Вы также можете использовать функцию 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 
+1

Интересный подход. Я ожидал, что кто-то предоставит ответ, включающий индексы массива [0] и [-1], но забыл о chomp, очевидно, лучшее решение. Думаю, ваш ответ лучше моего. – ChrisInEdmonton

+0

rchomp и lchomp должны быть требуемые функции, черт побери! –

35

можно использовать GSUB для поиска ведущих или цитату и заменить ее пустой строкой:

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

По предложению комментариев ниже, лучшим решением является:

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

Несколько советов: нет необходимости скрывать кавычки в 'Regexp', поскольку кавычки в любом случае не имеют никакого значения в' Regexp'. Кроме того, '^' и '$' * не * привязываются к началу и концу строки *, они привязываются к началу и концу строки *. Из вашего вопроса неясно, какой из двух вы хотите: если вы хотите удалить кавычки с начала и конца строки, вам нужно использовать '\ A' и' \ Z'. Наконец, вы можете избавиться от экранов для двойных кавычек (и путающих двойных двойных кавычек), разделив вашу строку на одинарные кавычки. –

+1

В целом это выглядит так: 's = '" foo, bar "'; s.gsub! (/ \ A "| \ Z" $ /, '') '(я забыл: также нет необходимости делать необязательным совпадение. Если это не соответствует, тогда просто ничего не будет заменено.) –

+3

@ Jörg, вы не имеете в виду 's.gsub! (/ \ A" | "\ Z /, '')'? – grddev

23

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

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

+17

Предполагая, что в середине строки нет '' '. – grddev

+0

В соответствии с примерами, представленными OP, есть только ведущие/завершающие двойные кавычки, поэтому это безопасное предположение. –

+6

Это не безопасное предположение, но я не указал, что внутри строки может быть цитата. Тем не менее, это хороший ответ, и один из них определенно стоит моего +1. – ChrisInEdmonton

7

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

remove_quotations('"foo,bar"') 

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

Это без регулярных выражений и starts_with?/End_with? хорошо читаемы.

0

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

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

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 
+0

К сожалению, это не отвечает на поставленный вопрос. – ChrisInEdmonton

+0

Регулярные выражения не приводят к некоторым фанки-ошибкам. Плохой код приводит к некоторым фанки-ошибкам. – zmilojko

3

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

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" 
0

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

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

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

+0

Это не подходит для трех приведенных примеров. – ChrisInEdmonton

+1

А не заметил, что котировки были необязательными в вашем случае. Однако это будет полезно для тех, у кого есть несколько разные требования. – emlai