При даден низ как да премахнете околните кавички, ако съществуват?

Дадени са следните низове:

  • Здравей свят
  • Здравей свят"
  • Здравей "свят" здравей
  • "Здравей свят"
  • „Здравей свят. Как е животът?“

Какъв би бил най-добрият начин да премахнете възможен низ, който започва и завършва с низ. Желаната възвръщаемост от функцията би била:

  • Здравей свят
  • Здравей свят"
  • Здравей "свят" здравей
  • Здравей свят
  • Здравей свят. Как е живота?

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
FYI, това не работи. Преминаването от 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 разбира регулярен израз, тогава може да сте в състояние да използвате същите изрази. - 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