Регулярное выражение для соответствия вкладке, которая не заключена в кавычки - PullRequest
1 голос
/ 08 декабря 2010

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

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, Таблица1, Таблица 2).Вторая строка данных.

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

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

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

Dim rows() as String
Regex = New Regex("\r\n")
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"

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

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

Спасибо:)

Ответы [ 3 ]

0 голосов
/ 08 декабря 2010

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

  1. Найдите вкладки, которые находятся в кавычках, и поменяйте их местами.
  2. Разделить наtabs
  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" );
}

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

0 голосов
/ 08 декабря 2010

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

0 голосов
/ 08 декабря 2010

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

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

И для справки, CSV Regex:

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

Пожалуйста, не захватывайте также и окружающие цитаты.

EDIT

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

EDITv2

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

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