2012-03-24 89 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