我有一个由冒号分隔的CSV文件,但它包含用引号括起来的文本字段,它们本身包含几个冒号。
我想要一个简单的解决方案来获取数据字段,但是例如。在ruby中,split方法在每个冒号上分裂。
是否有匹配所有冒号的正则表达式,除了用引号括起来的那些?
答案 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"]
那些正则表达式说要找
答案 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*(?<!^).*?|)(?=\:|$)/
是的,它并不像人们想象的那么容易......