web-dev-qa-db-ja.com

Rubyで、文字列から先頭と末尾の引用符を取り除く方法

Rubyで文字列から先頭と末尾の引用符を削除したいです。引用文字は0回または1回出現します。たとえば、次のすべてをfoo、barに変換する必要があります。

  • "foo,bar"
  • "foo,bar
  • foo,bar"
  • foo,bar
34
ChrisInEdmonton

chomp関数を使用することもできますが、残念ながら文字列の最後でしか機能しません。

_'"foo,bar"'.rchomp('"').chomp('"')
_

rchompの実装は簡単です。

_class String
  def rchomp(sep = $/)
    self.start_with?(sep) ? self[sep.size..-1] : self
  end
end
_

わずかに効率の悪いバージョンで、インラインで実行することもできます。

_'"foo,bar"'.chomp('"').reverse.chomp('"').reverse
_

編集: Ruby 2.5なので、rchomp(x)は_delete_prefix_という名前で利用でき、chomp(x)は利用可能です_delete_suffix_として、使用できることを意味します

_'"foo,bar"'.delete_prefix('"').delete_suffix('"')
_
33
grddev

Gsubを使用して、先頭または末尾の引用符を検索し、空の文字列に置き換えることができます。

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

以下のコメントで示唆されているように、より良い解決策は次のとおりです。

s.gsub!(/\A"|"\Z/, '')
37
ChrisInEdmonton

いつものように、誰もが最初にツールボックスから正規表現を取得します。 :-)

別の方法として、.tr('"', '')(別名「翻訳」)を調べることをお勧めします。

22
the Tin Man

別のアプローチは

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?がありません。読みやすい。

9
Yo Ludke

Stripはホワイトスペースでしか機能しないことにイライラします。あらゆる種類のキャラクターを取り除く必要があります!これを修正するString拡張機能を次に示します。

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"
3
Eva

私は同じものを望んでいましたが、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('"')
2
marcinowski

正規表現はかなり重く、ファンキーなエラーが発生する可能性があります。大量の文字列を処理しておらず、データがかなり均一である場合は、より単純なアプローチを使用できます。

文字列に開始引用符と先頭引用符があることがわかっている場合は、文字列全体を接合できます。

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
user427390