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

Chr*_*ton 35 ruby regex string

我想从一个字符串中删除Ruby中的前导和尾随引号.引号字符将出现0或1次.例如,以下所有内容都应转换为foo,bar:

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

Chr*_*ton 37

我可以使用gsub搜索前导或尾随引用并用空字符串替换它:

s = "\"foo,bar\""
s.gsub!(/^\"|\"?$/, '')
Run Code Online (Sandbox Code Playgroud)

如下面的评论所示,更好的解决方案是:

s.gsub!(/\A"|"\Z/, '')
Run Code Online (Sandbox Code Playgroud)

  • 一些提示:没有必要逃避`Regexp`中的引号,因为引号在`Regexp`中没有任何特殊含义.此外,`^`和`$`*不会*锚定到*string*的开头和结尾,它们锚定到*line*的开头和结尾.从你的问题中不清楚你想要的两个中的哪一个:如果你想从字符串的开头和结尾删除引号,你需要使用`\ A`和`\ Z`代替.最后,您可以通过用单引号分隔字符串来摆脱双引号(以及令人困惑的双引号)的转义. (7认同)
  • @Jörg,你不是指`s.gsub!(/\A"|"\ Z /,'')`? (3认同)

grd*_*dev 34

你也可以使用这个chomp函数,但不幸的是它只能在字符串的末尾起作用,假设有一个反向的chomp,你可以:

'"foo,bar"'.rchomp('"').chomp('"')
Run Code Online (Sandbox Code Playgroud)

实施rchomp很简单:

class String
  def rchomp(sep = $/)
    self.start_with?(sep) ? self[sep.size..-1] : self
  end
end
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以使用效率稍低的版本进行内联:

'"foo,bar"'.chomp('"').reverse.chomp('"').reverse
Run Code Online (Sandbox Code Playgroud)

编辑:既然红宝石2.5,rchomp(x)是的名义下获得delete_prefix,并且chomp(x)可以作为delete_suffix的,这意味着你可以使用

'"foo,bar"'.delete_prefix('"').delete_suffix('"')
Run Code Online (Sandbox Code Playgroud)


the*_*Man 22

像往常一样,每个人都首先从工具箱中获取正则表达式.:-)

作为替代方案,我建议调查.tr('"', '')(AKA"翻译"),在这个用途中,它实际上是剥离报价.

  • 假设字符串中间没有"``. (21认同)
  • 这不是一个安全的假设,但我没有具体说明字符串中可能有引号.不过,这是一个很好的答案,一个绝对值得我+1. (6认同)
  • <pedantry>他指定了"一个字符串".字符串可以包含任意字符,包括引号.</ pedantry> (2认同)

Yo *_*dke 9

另一种方法是

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 
Run Code Online (Sandbox Code Playgroud)

没有RegExps和start_with?/ end_with?非常好读.