Регулярное выражение, соответствующее вкладке, которая не заключена в кавычки

#.net #regex #string

#.net #регулярное выражение #строка

Вопрос:

у меня есть следующая строка:

 ID Table 1 Table 2
1 "Column 1 Column 2 Column 3
1 2 3
4 5 6
7 8 9" "Column A Column B Column C
a b c
d e f
g h i"
  

Первая строка содержит заголовки столбцов (ID, Table1 , таблица 2).
Вторая строка содержит данные.

Строка скопирована через буфер обмена с этого листа Excel: http://i.stack.imgur.com/5lwaT.png

Столбцы разделяются символом t, строка — символом r n. B2 и C2 — это таблицы. Ее столбцы и строка также разделены символами t и r n. Каждая таблица заключена в кавычки.

Теперь я разделяю строку:

 Dim rows() as String
Regex = New Regex("rn")
rows = Regex.Split(MyString)
  

Это возвращает:

 ID Table 1 Table 2
  

и

 1 "Column 1 Column 2 Column 3
1 2 3
4 5 6
7 8 9" "Column A Column B Column C
a b c
d e f
g h i"
  

Теперь мне нужно разделить строки, но мне нужен шаблон, который возвращает каждую вкладку, которая не заключена в кавычки.

Кто-нибудь может мне помочь с регулярным выражением?

Спасибо 🙂

Комментарии:

1. вам действительно следует ознакомиться с этой статьей secretgeek.net/csv_trouble.asp

Ответ №1:

Поскольку я слишком устал, чтобы придумать хороший ответ, вместо этого приведу простой. Если вы можете быть уверены, что кавычки соединены, вы могли бы легко взломать это в три шага:

  1. Найдите вкладки, заключенные в кавычки, и поменяйте их местами.
  2. Разбить на вкладки
  3. Верните настоящие вкладки обратно.

Вот так:

 // JS psuedo-code
str = str.replace( /("[^"]*)t([^"]*")/g, '$1ëïÒ$2' );
pieces = str.split( /t/ );
for (var i=0,len=pieces.length;i<len;  i){
  pieces[i] = pieces[i].replace( /ëïÒ/g, "t" );
}
  

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

Ответ №2:

Что вы пытаетесь сделать, так это создать свой анализатор CSV (в вашем случае замените запятую на tab). Есть отличная статья о том, почему вы не должны этого делать: http://secretgeek.net/csv_trouble.asp Однажды я попытался написать свой собственный анализатор, но затем остановился, потому что это действительно не так просто. Проверьте это бесплатное выражение. Это сэкономило мне пару часов.

Комментарии:

1. Пока оно соответствует правильному синтаксису, синтаксический анализатор не слишком сложен. Проблема в том, что большинство пользователей, экспортирующих в CSV, не знают об оговорках (заключает строки-запятые в кавычки, экранирует кавычки внутри кавычек, заключает многострочные значения в кавычки и т.д.)

2. @Брэд Кристи это отнимает время, которое можно легко сэкономить.

Ответ №3:

Я использую это для своих CSV-файлов, но следует, с некоторыми незначительными изменениями, заставить его работать и с разделителями табуляции:

 Regex rExp = new Regex(@"(?:^|x09)(""(?:[^""] |"")*""|[^x09]*)");
  

И для справки, регулярное выражение в формате CSV:

 Regex rExp = new Regex(@"(?:^|,)(""(?:[^""] |"""")*""|[^,]*)");
  

Пожалуйста, не делайте этого, чтобы также захватить окружающие кавычки.

Редактировать

Возможно, я слишком много предполагаю, но похоже, что вы пытаетесь получить значения и запутываетесь в разделителе. Это позволит зафиксировать значения внутри разделителей.

EDITv2

Используются дословные строки

Комментарии:

1. как насчет использования дословных строк? это значительно сократит количество символов в строке

2. Это более удовлетворительно? 😉