Rubyで文字列から先頭と末尾の引用符を削除したいです。引用文字は0回または1回出現します。たとえば、次のすべてをfoo、barに変換する必要があります。
"foo,bar"
"foo,bar
foo,bar"
foo,bar
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('"')
_
Gsubを使用して、先頭または末尾の引用符を検索し、空の文字列に置き換えることができます。
s = "\"foo,bar\""
s.gsub!(/^\"|\"?$/, '')
以下のコメントで示唆されているように、より良い解決策は次のとおりです。
s.gsub!(/\A"|"\Z/, '')
いつものように、誰もが最初にツールボックスから正規表現を取得します。 :-)
別の方法として、.tr('"', '')
(別名「翻訳」)を調べることをお勧めします。
別のアプローチは
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?がありません。読みやすい。
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"
私は同じものを望んでいましたが、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('"')
正規表現はかなり重く、ファンキーなエラーが発生する可能性があります。大量の文字列を処理しておらず、データがかなり均一である場合は、より単純なアプローチを使用できます。
文字列に開始引用符と先頭引用符があることがわかっている場合は、文字列全体を接合できます。
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