рубиновый код для изменения внешних кавычек в строках?

Кто-нибудь знает о драгоценном камне Ruby (или встроенном, или нативном синтаксисе, если на то пошло), который работает с внешними кавычками строк?

Я ловлю себя на том, что пишу такие методы снова и снова:

remove_outer_quotes_if_quoted( myString, chars ) -> aString
add_outer_quotes_unless_quoted( myString, char ) -> aString

Первый проверяет myString, чтобы увидеть, совпадают ли его начальный и конечный символы с каким-либо одним символом в chars. Если это так, он возвращает строку с удаленными кавычками. В противном случае он возвращает его без изменений. chars по умолчанию представляет собой список символов кавычек.

Второй проверяет myString, чтобы увидеть, начинается ли он уже и заканчивается ли он char. Если это так, он возвращает строку без изменений. Если нет, он возвращает строку с добавлением char до и после, а любое встроенное вхождение char экранируется обратной косой чертой. char по умолчанию является первым в списке символов по умолчанию.

(Конечно, у моих придуманных вручную методов нет таких подробных названий.)

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


person Blue    schedule 12.12.2010    source источник
comment
Вы можете посмотреть, почему вы так часто делаете. Небольшой анализ основных причин может помочь вам сделать ваш код чище.   -  person Mark Thomas    schedule 13.12.2010
comment
@Mark Thomas: Если бы я мог больше голосовать за ваш комментарий, я бы это сделал. Так как мне кажется, что есть более глубокая подоплека проблемы.   -  person mpd    schedule 13.12.2010
comment
Хе-хе. Основная причина в том, что я работаю с несколькими разными API, каждый из которых цитирует одни и те же данные немного по-разному. Я действительно не имею никакого контроля над ними.   -  person Blue    schedule 13.12.2010
comment
Я ловлю себя на том, что пишу подобные методы снова и снова. Тогда не делай этого. Следуйте мантре DRY и не повторяйтесь; Создайте крошечный модуль, который расширяет String и требует его в своем коде.   -  person the Tin Man    schedule 13.12.2010
comment
@ Грег: Точно. На самом деле настолько СУХОЙ, что я подумал, что сначала поспрашиваю, нет ли уже в дикой природе какого-нибудь драгоценного камня, который делает что-то подобное.   -  person Blue    schedule 15.12.2010
comment
@Синий, хорошая мысль. Если вы уже используете Rails или используете части ActiveSupport, вы, вероятно, можете найти что-то уже написанное и использовать его. В противном случае я бы расширил String и не беспокоился о какой-то другой жемчужине. Если вы найдете его, велики шансы, что вы в конечном итоге получите гораздо больше кода, который не использовался, компенсируя преимущество DRY.   -  person the Tin Man    schedule 16.12.2010
comment
Не забудьте пометить ответы как принятые, если они решили ваши вопросы.   -  person Andrew Grimm    schedule 20.10.2011


Ответы (3)


Если вы делаете это часто, вы можете добавить метод в String:

class String
  def strip_quotes
    gsub(/\A['"]+|['"]+\Z/, "")
  end
end

Тогда вы можете просто позвонить string.strip_quotes.

Добавление кавычек аналогично:

class String
  def add_quotes
     %Q/"#{strip_quotes}"/ 
  end
end

Это называется string.add_quotes и использует strip_quotes перед добавлением двойных кавычек.

person Mark Thomas    schedule 13.12.2010
comment
Имейте в виду, что приведенный выше код потенциально удалит несовпадающие кавычки и удалит несколько кавычек с одного или обоих концов строки, если они есть. Ему все равно, оба они или ', он просто их лишает. - person TJChambers; 25.03.2015

Это может объяснить, как их удалить и добавить:

str1 = %["We're not in Kansas anymore."]
str2 = %['He said, "Time flies like an arrow, Fruit flies like a banana."']

puts str1
puts str2

puts

puts str1.sub(/\A['"]/, '').sub(/['"]\z/, '')
puts str2.sub(/\A['"]/, '').sub(/['"]\z/, '')

puts 

str3 = "foo"
str4 = 'bar'

[str1, str2, str3, str4].each do |str|
  puts (str[/\A['"]/] && str[/['"]\z/]) ? str : %Q{"#{str}"}
end

Исходные две строки:

# >> "We're not in Kansas anymore."
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."'

Цитаты за раздевание:

# >> We're not in Kansas anymore.
# >> He said, "Time flies like an arrow, Fruit flies like a banana."

Добавление кавычек при необходимости:

# >> "We're not in Kansas anymore."
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."'
# >> "foo"
# >> "bar"
person the Tin Man    schedule 13.12.2010
comment
Спасибо за предложения. Я написал свои собственные методы (которые должны иметь дело со строками вроде %['Это была ночь перед Рождеством] и %['Это нелогично], среди прочих аномалий), но мне просто интересно, не изобретаю ли я колесо здесь. - person Blue; 13.12.2010

Я бы использовал value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0]). Короче говоря, этот простой код проверяет, совпадают ли первый и последний символы строки, и удаляет их, если они являются одинарными/двойными кавычками. Кроме того, можно добавить столько типов котировок, сколько необходимо.

%w["adadasd" 'asdasdasd' 'asdasdasd"].each do |value|
  puts 'Original value: ' + value
  value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0])
  puts 'Processed value: ' + value
end

В приведенном выше примере будет напечатано следующее:

Original value: "adadasd"
Processed value: adadasd
Original value: 'asdasdasd'
Processed value: asdasdasd
Original value: 'asdasdasd"
Processed value: 'asdasdasd"
person BR0kEN    schedule 28.12.2017