如何用冒号分割字符串而不是引号

时间:2011-02-11 14:21:08

标签: ruby regex csv

我有一个由冒号分隔的CSV文件,但它包含用引号括起来的文本字段,它们本身包含几个冒号。

我想要一个简单的解决方案来获取数据字段,但是例如。在ruby中,split方法在每个冒号上分裂。

是否有匹配所有冒号的正则表达式,除了用引号括起来的那些?

4 个答案:

答案 0 :(得分:8)

假设:

str = 'foo:bar:"jim:jam":jar'

你可以这样做:

a = str.scan( /([^":]+)|"([^"]+)"/ ).flatten.compact
p a
#=> ["foo", "bar", "jim:jam", "jar"]

或者你可以这样做:

a = []
str.scan( /([^":]+)|"([^"]+)"/ ){ a << ($1 || $2) }
p a
#=> ["foo", "bar", "jim:jam", "jar"]

那些正则表达式说要找

  • 一个或多个不是a-quote-or-a-colon,
  • 的字符
  • 引用,后跟一个或多个非引号的字符,后跟引号。

答案 1 :(得分:6)

答案 2 :(得分:1)

你可以用双引号而不是冒号分开

>> str = 'foo:bar:"jim:jam":jar'
=> "foo:bar:\"jim:jam\":jar"
>> str.split("\"").each_with_index do |x,y|
?>  puts y%2==0 ? x.split(":") : x
>> end
foo
bar
jim:jam

jar

答案 3 :(得分:0)

第一次尝试是如此糟糕,修改了整个事情。这是我的正则表达式解决方案:

获取最后的天文位字段':' = :last
修剪:/(?:^\s*:|:|^)\s*(".*?"|.*?)(?=\s*(?:\:|$))/
无修剪:/(?:(?<!^):|^)(\s*".*?"\s*|.*?)(?=\:|$)/

------------------

获得第一个和最后一个除界区域':' = first:last
修剪:/(?:^|:)\s*(".*?"|(?<!^).*?|)(?=\s*(?:\:|$))/
没有修剪:/(?:^|:)(\s*".*?"\s*|\s*(?<!^).*?|)(?=\:|$)/

是的,它并不像人们想象的那么容易......