Нужна помощь в получении этого регулярного выражения - PullRequest
2 голосов
/ 25 марта 2012

Я пытаюсь разобрать значения, разделенные запятыми в этих 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.Бейра Рио и Прокс.Av Odilon Coutinho, это не то, что я хочу.

РЕДАКТИРОВАТЬ: я должен был указать, что это не из файла CSV.Это параметры функции из исходного кода веб-страницы.

Ответы [ 3 ]

4 голосов
/ 25 марта 2012

Вы можете использовать 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, а Array в качестве источника, вам нужно немногоАдаптация:

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

Оба метода ожидают массив с массивами из одного элемента.

2 голосов
/ 25 марта 2012

Если вы хотите сделать это с помощью регулярных выражений, вы можете сделать что-то вроде:

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

и затем получить группы

1 голос
/ 25 марта 2012

Удачи в разборе контекстно-свободные вещи с регулярное выражение. Ваши данные выглядят как 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"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...