我希望将字符串拆分为(','),但如果它们在引号内,则忽略','。例如
" 2,2,4,'hello', 'world', 'hi, there' "
我想将它拆分为'嗨,不会在ruby中拆分成两个不同的数组元素。 我怎样才能做到这一点?可能使用一些正则表达式?
编辑: 如果我使用它,(从链接到可能的dublicate)
values = values.split(',(?=([^\"]*\"[^\"]*\")*[^\"]*$)', -1)
我的字符串被正确分割,但现在我无法使用 我的数组上的.delete_at()方法。在我能做之前:
values.delete_at(20)
答案 0 :(得分:2)
非常好。从this answer中获取灵感,您正在寻找的正则表达式是:
values.split(/,(?=(?:[^']*'[^']*')*[^']*$)/)
如果你有转义引号,这将无效,例如(e.g. "'O\'Reilly\'s car'"
)。
然而,这看起来有点像XY问题。如果您想要解析CSV,并且这是一个兼容的CSV,您可以使用CSV.parse
或CSV.parse_line
。由于色谱柱分离器之间有额外的空间,因此不是这样。如果可能,使用标准格式和标准解析器几乎总是优于本土解决方案。
答案 1 :(得分:1)
这是一个非正则表达式解决方案:
str = " 2,2,4,'hello', 'world', 'hi, there' "
first_quote_read = false
str.each_char.with_object (['']) do |c,a|
if c == ?, && !first_quote_read
a << ''
else
a[-1] << c
first_quote_read = !first_quote_read if c == ?'
end
end
#=> [" 2", "2", "4", "'hello'", " 'world'", " 'hi, there' "]