如何在Ruby中从字符串中去除前导和尾随引号

lf3rwulv  于 2023-05-06  发布在  Ruby
关注(0)|答案(9)|浏览(309)

在Ruby中,我想从字符串中去掉前导引号和尾随引号。引号字符将出现0或1次。例如,以下所有内容都应转换为foo,bar:

  • "foo,bar"
  • "foo,bar
  • foo,bar"
  • foo,bar
vatpfxk5

vatpfxk51#

从Ruby 2.5开始,反向chomp(x)delete_prefix的名称可用,而chomp(x)delete_suffix的名称可用,这意味着您可以使用

'"foo,bar"'.delete_prefix('"').delete_suffix('"')

旧答案:对于早期的Ruby版本,你可以使用chomp函数,但不幸的是,它只在字符串的末尾工作,假设有一个反向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
bxgwgixi

bxgwgixi2#

我可以使用gsub来搜索前导或尾随引号,并将其替换为空字符串:

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

正如下面的评论所建议的,一个更好的解决方案是:

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

hgncfbus3#

像往常一样,每个人都首先从工具箱中获取regex。:—)
作为替代,我建议研究.tr('"', '')(又名“翻译”),在这种情况下,它实际上是剥离引号。

cnwbcb6i

cnwbcb6i4#

另一种方法是

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?是很好的可读性。

pxy2qtax

pxy2qtax5#

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"
wkftcu5l

wkftcu5l6#

假设引号只能出现在开头或结尾,您可以直接删除所有引号,无需任何自定义方法:

'"foo,bar"'.delete('"')
zynd9foi

zynd9foi7#

我想要相同的,但对于url路径中的斜杠,可以是/test/test/test/(这样它在中间有剥离字符),最终想出了这样的东西来避免regexp:

'/test/test/test/'.split('/').reject(|i| i.empty?).join('/')

在这种情况下,显然可以翻译为:

'"foo,bar"'.split('"').select{|i| i != ""}.join('"')

'"foo,bar"'.split('"').reject{|i| i.empty?}.join('"')
2q5ifsrm

2q5ifsrm8#

正则表达式可能会非常繁重,并导致一些奇怪的错误。如果你不是在处理大量的字符串,并且数据非常均匀,你可以使用一种更简单的方法。
如果你知道字符串有起始引号和前导引号,你可以拼接整个字符串:

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
mw3dktmi

mw3dktmi9#

你可以用scan去掉非可选的引号:

'"foo"bar"'.scan(/"(.*)"/)[0][0]
# => "foo\"bar"

相关问题