Учитывая строку, как удалить окружающие кавычки, если они существуют?

Учитывая следующие строки:

  • Привет мир
  • Привет мир"
  • Привет "мир" привет
  • "Привет мир"
  • "Привет, мир. Как жизнь?"

Что было бы лучшим способом удалить возможную строку, которая начинается и заканчивается строкой. Желаемый возврат от функции будет:

  • Привет мир
  • Привет мир"
  • Привет "мир" привет
  • Привет мир
  • Привет мир. Как жизнь?

person AnApprentice    schedule 12.01.2017    source источник


Ответы (2)


Если вы говорите об удалении кавычек только в начале и конце строк:

string.sub(/\A"/, '').sub(/"\z/, '')

Если вы имеете в виду только, если присутствует как в начале, так и в конце:

string.sub(/\A"(.*)"\z/, '\\1')
person tadman    schedule 12.01.2017
comment
На самом деле это не сработало в случае, когда строка содержит два предложения... привет, мир. Привет еще раз - person AnApprentice; 12.01.2017
comment
Это должно убрать кавычки спереди и сзади практически всего, включая ваш пример: %q["Hello World. How's life?"].sub(/\A"(.*)"\z/, '\\1') дает "Hello World. How's life?", но обратите внимание, что эти кавычки окружают строку Ruby, а не в ней. Проверьте с помощью puts, если вы не уверены. - person tadman; 12.01.2017
comment
что делает %q[? - person AnApprentice; 12.01.2017
comment
Кроме того, как мне использовать это с переменной внутри? - person AnApprentice; 12.01.2017
comment
К вашему сведению, это не работает. Переход от s = s.sub(/\A"(.*)"\z/, '\\1') к s= %q["s"].sub(/\A"(.*)"\z/, '\\1') теперь просто возвращает s - person AnApprentice; 12.01.2017
comment
Разве не этого ты хотел? Ни в одном из ваших примеров нет ни одного слова в кавычках. - person tadman; 12.01.2017
comment
Может быть, я не понимаю новую рекомендацию. Не могли бы вы обновить свой ответ? Спасибо - person AnApprentice; 12.01.2017
comment
К вашему сведению, в итоге это сработало отлично s.gsub!(/\A"|"\Z/, '') - person AnApprentice; 12.01.2017
comment
Не имеет значения, используете ли вы s или string, но %q["s"] запрашивает литеральную строку "\"s\"", она не имеет ничего общего с переменной. Может быть, вы думаете о %Q["#{s}"]? - person tadman; 12.01.2017

Используя пронумерованные сохранения (иногда называемые «регистрами») и sed, это довольно просто:

$ cat quotes
Hello World
Hello "world"
Hello "world" hello
"Hello World"
"Hello World. How's life?"
$ cat quotes | sed 's/^\(\"\)\(.*\)\1$/\2/'
Hello World
Hello "world"
Hello "world" hello
Hello World
Hello World. How's life?

Сценарий sed говорит: «в начале строки ^, если есть одна двойная кавычка», сохраните ее \("\) в пронумерованном сохранении один, сохраните все остальное \(.*\), вплоть до нумерованного сохранения один в конце строки $, в пронумерованном сохранении два, затем замените все это на пронумерованное, кроме двух (все остальное между двойными кавычками).Если в начале нет кавычки, нумерованное сохранение пусто, и если в начале есть одно, а в конце нет, то шаблон не соответствует.Существуют другие языки сценариев, такие как perl, которые легко обрабатывают регулярные выражения.

person Thomas Hedden    schedule 12.01.2017
comment
P.S. Извините, я не заметил, что вы спрашивали конкретно о Ruby, о котором я ничего не знаю. Но если Ruby понимает регулярное выражение, возможно, вы сможете использовать те же выражения. - person Thomas Hedden; 12.01.2017
comment
Обычно не рекомендуется публиковать ответы на языке, отличном от запрашиваемого. Это загромождает ответы вещами, которые не являются решениями. - person tadman; 12.01.2017
comment
извините, не знаю, как это сделать в ruby. Это не сработало s = s.sub('s/^\(\"\)\(.*\)\1$/\2/') - person AnApprentice; 12.01.2017