我试图在这4个示例源
中解析用逗号分隔的值1,'Tambaú','Praça Santo António','Tambaú','12x0',2,'I','EM',12,6,5934,50
2,'Beira Rio','Av. Beira Rio, Prox. Av Odilon Coutinho','Beira Rio','12x0',2,'I','EM',12,0,7249,0
3,'Cabo Branco','Cabo Branco, Prox. Rua Alice de Almeida','Cabo Branco','12x0',2,'I','EO',12,0,4751,0
901,'teste','teste','teste','Mini-estação de demonstração',1,'I','EO',2,1,97,50`
我在Ruby中使用正则表达式('?.*?'?),
。我可以像我想要的那样得到第一个和最后一个解析。然而,第二和第三的问题是名称中有一个逗号(Av.Beira Rio,Prox.Av Odilon Coutinho和Cabo Branco,Prox.Rua Alice de Almeida)。凭借我的正则表达式,它们分开了。例如,我得到Av。 Beira Rio和Prox。 Av Odilon Coutinho不是我想要的。
编辑:我应该指定这不是来自CSV文件。它是来自网页源代码的函数的参数。
答案 0 :(得分:4)
您可以使用CSV并设置:quote_char => "'"
来处理字段内的分隔符:
#encoding: utf-8
require 'csv'
input = <<data
1,'Tambaú','Praça Santo António','Tambaú','12x0',2,'I','EM',12,6,5934,50
2,'Beira Rio','Av. Beira Rio, Prox. Av Odilon Coutinho','Beira Rio','12x0',2,'I','EM',12,0,7249,0
3,'Cabo Branco','Cabo Branco, Prox. Rua Alice de Almeida','Cabo Branco','12x0',2,'I','EO',12,0,4751,0
901,'teste','teste','teste','Mini-estação de demonstração',1,'I','EO',2,1,97,50
data
CSV.new(input, :quote_char => "'").each{|data|
p data.size
p data
}
如果您没有String但数组作为源,则需要稍微调整一下:
#encoding: utf-8
require 'csv'
regexArr = [
["1,'Tambaú','Praça Santo António','Tambaú','12x0',2,'I','EM',12,6,5934,50"],
["2,'Beira Rio','Av. Bei ra Rio, Prox. Av Odilon Coutinho','Beira Rio','12x0',2,'I','EM',12,0,7249,0"],
["3,'Cabo Branco','Cabo Bra nco, Prox. Rua Alice de Almeida','Cabo Branco','12x0',2,'I','EO',12,0,4751,0"],
["901,'teste','teste','test e','Mini-estação de demonstração',1,'I','EO',2,1,97,50"]
]
regexArr.each do |loc|
CSV.new(loc.first, :quote_char => "'").each do |data|
p data
end
end
作为替代方案,您可以构建一个字符串:
input = regexArr.flatten.join("\n")
CSV.new(input, :quote_char => "'").each{|data|
p data.size
p data
}
两种方法都期望一个具有单元素数组的数组。
答案 1 :(得分:2)
如果你想用正则表达式做,你可以这样做:
^(([^,]*)(,|$))*
然后获取组
答案 2 :(得分:1)
祝你好运解析
context-free的东西
正则表达式。您的数据类似于CSV
。
CSV.parse("901,'teste','teste','teste','Mini-estação de demonstração',1,'I','EO',2,1,97,50")
=> [["901",
"'teste'",
"'teste'",
"'teste'",
"'Mini-estação de demonstração'",
"1",
"'I'",
"'EO'",
"2",
"1",
"97",
"50"]]