我想在Ruby中从字符串中删除引号和尾随引号。引号字符将出现0或1次。例如,以下所有内容都应转换为foo,bar:
"foo,bar"
"foo,bar
foo,bar"
foo,bar
答案 0 :(得分:36)
我可以使用gsub搜索前导或尾随引号并将其替换为空字符串:
s = "\"foo,bar\""
s.gsub!(/^\"|\"?$/, '')
根据以下评论的建议,更好的解决方案是:
s.gsub!(/\A"|"\Z/, '')
答案 1 :(得分:30)
你也可以使用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
编辑:自Ruby 2.5以来,rchomp(x)
名称delete_prefix
下可用,chomp(x)
名称delete_suffix
可用,意味着你可以使用
'"foo,bar"'.delete_prefix('"').delete_suffix('"')
答案 2 :(得分:23)
像往常一样,每个人都首先从工具箱中获取正则表达式。 : - )
作为替代方案,我建议调查.tr('"', '')
(AKA“翻译”),在这个用途中,它实际上是剥离引号。
答案 3 :(得分: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
没有RegExps和start_with?/ end_with?很可读。
答案 4 :(得分:3)
让我感到沮丧的是,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"
答案 5 :(得分:2)
我想要相同的但是对于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('"')
答案 6 :(得分:0)
正则表达式可能相当沉重,导致一些时髦的错误。如果你没有处理大量字符串并且数据非常统一,你可以使用更简单的方法。
如果你知道字符串有起始和引导引号,你可以拼接整个字符串:
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
答案 7 :(得分:-1)
假设引号只能出现在开头或结尾,您只需删除所有引号,而无需任何自定义方法:
'"foo,bar"'.delete('"')
答案 8 :(得分:-1)
您可以使用scan
删除非可选引号:
'"foo"bar"'.scan(/"(.*)"/)[0][0]
# => "foo\"bar"