Как разбить строку по двоеточиям НЕ в кавычках - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть CSV-файл, разделенный двоеточиями, но он содержит текстовые поля, заключенные в кавычки, которые сами содержат несколько двоеточий.

Я хотел бы получить простое решение для получения полей данных, но, например. в ruby ​​метод split разбивает каждое двоеточие.

Существует ли регулярное выражение для всех двоеточий, кроме заключенных в кавычки?

Ответы [ 4 ]

8 голосов
/ 11 февраля 2011

Дано:

str = 'foo:bar:"jim:jam":jar'

Вы можете сделать это:

a = str.scan( /([^":]+)|"([^"]+)"/ ).flatten.compact
p a
#=> ["foo", "bar", "jim:jam", "jar"]

Или вы можете сделать это:

a = []
str.scan( /([^":]+)|"([^"]+)"/ ){ a << ($1 || $2) }
p a
#=> ["foo", "bar", "jim:jam", "jar"]

Эти регулярные выражения говорят, чтобы найти либо

  • Один или несколько символов, которые не являются кавычкой или двоеточием, или
  • Кавычка, за которой следует однаили более символов, которые не являются кавычками, за которыми следует кавычка.
6 голосов
/ 11 февраля 2011
1 голос
/ 11 февраля 2011

вы можете разделить на двойные кавычки вместо двоеточий

>> str = 'foo:bar:"jim:jam":jar'
=> "foo:bar:\"jim:jam\":jar"
>> str.split("\"").each_with_index do |x,y|
?>  puts y%2==0 ? x.split(":") : x
>> end
foo
bar
jim:jam

jar
0 голосов
/ 11 февраля 2011

Первая попытка была такой неудачной, пересмотрел всю вещь.Это моё регулярное решение:

ПОЛУЧАЕТ ПОСЛЕДНЕЕ поле делимера ':' = :last
Обрезки: /(?:^\s*:|:|^)\s*(".*?"|.*?)(?=\s*(?:\:|$))/
Без обрезки: /(?:(?<!^):|^)(\s*".*?"\s*|.*?)(?=\:|$)/

------------------

ПОЛУЧАЕТ ПЕРВЫЕ И ПОСЛЕДНИЕ поля делимера ':' = first:last
Обрезки: /(?:^|:)\s*(".*?"|(?<!^).*?|)(?=\s*(?:\:|$))/
Без обрезки: /(?:^|:)(\s*".*?"\s*|\s*(?<!^).*?|)(?=\:|$)/

Ида, это не так просто, как кажется ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...