需要帮助正确使用此正则表达式

时间:2012-03-24 22:27:03

标签: ruby regex

我试图在这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文件。它是来自网页源代码的函数的参数。

3 个答案:

答案 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"]]