Я хочу удалить ведущие и завершающие кавычки в Ruby из строки. Символ кавычки будет иметь значение 0 или 1 раз. Например, все следующее должно быть преобразовано в foo, bar:
-
"foo,bar"
-
"foo,bar
-
foo,bar"
-
foo,bar
Я хочу удалить ведущие и завершающие кавычки в Ruby из строки. Символ кавычки будет иметь значение 0 или 1 раз. Например, все следующее должно быть преобразовано в foo, bar:
"foo,bar"
"foo,bar
foo,bar"
foo,bar
Вы также можете использовать функцию 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('"')
Я могу использовать gsub для поиска главной или конечной цитаты и заменить ее пустой строкой:
s = "\"foo,bar\""
s.gsub!(/^\"|\"?$/, '')
Как предложено ниже, лучшее решение:
s.gsub!(/\A"|"\Z/, '')
Как обычно, все захватывают регулярное выражение из инструментария.: -)
В качестве альтернативы я порекомендую посмотреть .tr('"', '')
(AKA "translate" ), который в этом использовании действительно лишает кавычки.
Другой подход
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? хорошо читаемы.
Это расстраивает меня, что полоса работает только в пробеле. Мне нужно снять все виды персонажей! Здесь расширение строки, которое будет исправлять:
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"
Я хотел то же самое, но для косой черты в 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('"')
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
Предполагая, что кавычки могут появляться только в начале или конце, вы можете просто удалить кавычки all без специального метода:
'"foo,bar"'.delete('"')
Вы можете снять необязательные кавычки с помощью scan
:
'"foo"bar"'.scan(/"(.*)"/)[0][0]
# => "foo\"bar"