2012-03-24 98 views
2

我试图解析这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。贝拉里约和Prox。 Av Odilon Coutinho,这不是我想要的。

编辑:我应该指定,这不是从一个CSV文件。它是网页源代码中函数的参数。

+2

正则表达式是不适合这个任务。不要使用它们。使用CSV解析器。 [Ruby有一个内置的](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html)。 – meagar 2012-03-24 22:30:47

+0

@meagar这根本不对。 **你非常肯定*可以*使用正则表达式。**没有理由重新创建轮子。 – tchrist 2012-03-24 22:40:20

+0

@meagar - 我应该指定这不是来自CSV文件。它是网页源代码中函数的参数。 – devcoder 2012-03-24 23:07:25

回答

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 
} 

如果你没有一个字符串,但数组作为源,你需要一点点适应:

#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 
} 

这两种方法都期望有一个元素数组的数组。

+0

我不确定这里发生了什么,输入字符串在哪里? – devcoder 2012-03-25 00:51:48

+0

对不起,我在'__END__'(存储在'DATA')后面的文本中获取数据。 'DATA'就像是一个文件句柄,详细信息见[另一个问题](http://stackoverflow.com/questions/1333720/ruby-scope-of-data-after-end)。我修改了我的答案,现在使用一个[Here-Document](http://en.wikipedia.org/wiki/Here_document#Ruby)。我希望没有那么令人困惑。 – knut 2012-03-25 08:45:51

+0

我和你做了同样的事情,但我没有得到任何输出。如果这些单引号需要在每个元素周围都需要CSV来解析它们,那么我们可以不用syre,这里是代码 'regexArr.each do | loc | CSV.new(loc [0],:quote_char => “'”)do | data | 个放数据 端 end' 这里regexArr包含所有这些字符串作为字符串的阵列的在下面 – devcoder 2012-03-25 16:13:33

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"]] 
+0

这似乎是一个非常好,比正则表达式更容易。然而,这不适合我的目的。我遇到了与正则表达式分析相同的问题。它仍然分离出'Av。贝拉里约“,”Prox。 Av Odilon Coutinho'分为两个不同的元素,当它是原始名称时。 '1.9.2p318:002> CSV.parse(“2,'Beira Rio','Av。Beira Rio,Prox。Av Odilon Coutinho','Beira Rio','12x0',2,'I' EM',12,0,7249,0“) => [[”2“,”'Beira Rio'“,''Av。Beira Rio','Prox。Av Odilon Coutinho'','Beira Rio'',''12x0'','2',''I'',''EM'“,”12“,”0“,”7249“,”0“ ]] 1.9.2p318:003>' – devcoder 2012-03-25 00:41:47

2

如果你想用正则表达式来做到这一点,你可以这样做:

^(([^,]*)(,|$))* 

然后拿到团体

+0

我想你会发现更像'/'([^'] +?)',?|([^ ,] +),?|,/'会更好,但你必须修剪空字段。 – tchrist 2012-03-24 22:49:44