.split和Ruby中的正则表达式

时间:2015-06-15 05:05:54

标签: ruby regex

我希望将字符串拆分为(','),但如果它们在引号内,则忽略','。例如

" 2,2,4,'hello', 'world', 'hi, there' "

我想将它拆分为'嗨,不会在ruby中拆分成两个不同的数组元素。 我怎样才能做到这一点?可能使用一些正则表达式?

编辑: 如果我使用它,(从链接到可能的dublicate)

values = values.split(',(?=([^\"]*\"[^\"]*\")*[^\"]*$)', -1)

我的字符串被正确分割,但现在我无法使用 我的数组上的.delete_at()方法。在我能做之前:

values.delete_at(20)

2 个答案:

答案 0 :(得分:2)

非常好。从this answer中获取灵感,您正在寻找的正则表达式是:

values.split(/,(?=(?:[^']*'[^']*')*[^']*$)/)

如果你有转义引号,这将无效,例如(e.g. "'O\'Reilly\'s car'")。

然而,这看起来有点像XY问题。如果您想要解析CSV,并且这是一个兼容的CSV,您可以使用CSV.parseCSV.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' "]