Как использовать регулярные выражения в приложении для iPhone, чтобы отделить строку, (запятая) - PullRequest
7 голосов
/ 31 января 2012

Я должен прочитать .csv файл, который имеет три столбца. При синтаксическом анализе файла .csv я получаю строку в этом формате Кристофер Басс, \ "Плач финального эссе любимой страны \", cbass@cgs.k12.va.us. Я хочу сохранить значения трех столбцов в массиве, поэтому я использовал метод componentSeparatedByString:@","! Он успешно возвращает мне массив с тремя компонентами:

  1. Кристофер Басс
  2. Плач финального эссе любимой страны
  3. cbass@cgs.k12.va.us

но когда в значении столбца уже есть запятая, вот так Кристофер Басс, \ "Плачь, финальное эссе любимой страны \", cbass@cgs.k12.va.us она разделяет строку на четыре компонента, потому что после Cry есть знак (*) 1016 *

  1. Кристофер Басс
  2. Cry
  3. Финальное сочинение любимой страны
  4. cbass@cgs.k12.va.us

Итак, как мне справиться с этим с помощью регулярного выражения. У меня есть классы "RegexKitLite", но какое регулярное выражение я должен использовать. Пожалуйста, помогите!

* 1031 Благодарения и *

Ответы [ 5 ]

2 голосов
/ 31 января 2012

Любое регулярное выражение, вероятно, окажется с той же проблемой, что вам нужно для очистки ваших записей или строк, путем экранирования запятых или выделения строк следующим образом: "My string".В противном случае у вас будет такая же проблема.Удачи.

Для вашего примера вам, вероятно, потребуется сделать что-то вроде:

\"Christopher Bass\",\"Cry\, the Beloved Country Final Essay\",\"cbass@cgs.k12.va.us\"

Таким образом, вы можете использовать регулярное выражение или даже тот же метод из класса NSString.

Совсем не связано, , но важность санации строк: http://xkcd.com/327/ хе-хе.

1 голос
/ 09 февраля 2012

Как насчет этого:

componentsSeparatedByRegex:@",\\\"|\\\","

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

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

Doe, John,\"\"Why Unescaped Strings Suck\", And Other Development Horror Stories\",Doe, John <john.doe@dev.null>

Надеемся, что в ваших данных CSV нет ничего подобного приведенному выше.Если есть, данные в основном непригодны, и вам стоит поискать лучшего экспортера CSV.

0 голосов
/ 09 февраля 2012

Последняя часть выглядит так, как будто в ней никогда не будет запятой.Насколько я вижу, не будет и первой ...

Как насчет разбиения строки следующим образом:

NSArray *splitArr = [str componentsSeparatedByString:@","];
NSString *nameStr = [splitArr objectAtIndex:0];
NSString *emailStr = [splitArr lastObject];

NSString *contentStr = @"";
for(int i=1; i<[splitArr count]-1; ++i) {
    contentStr = [contentStr stringByAppendingString:[splitArr objectAtIndex:i]];
}

При этом первая и последняя строки будут использоваться как есть, и объединятсяостальное в контенте.

Вроде хак, но имя и адрес электронной почты никогда не будут содержать запятой, верно?

0 голосов
/ 09 февраля 2012

Гарантируется ли заголовок кавычками?И это единственный компонент, который может иметь их?Потому что тогда componentSeparatedByString:@"\"" должен получить вам это:

  1. Кристофер Басс,
  2. Cry, Финальное сочинение любимой страны
  3. , cbass @ cgs.k12.va.us

Затем используйте componentSeparatedByString:@"," или substringFrom/ToIndex:, чтобы избавиться от двух запятых в первом и последнем компоненте.

Вот решение с использованием подстроки:

NSString* input = @"Christopher Bass,\"Cry, the Beloved Country Final Essay\",cbass@cgs.k12.va.us";
NSArray* split = [input componentsSeparatedByString:@"\""];
NSString* part1 = [split objectAtIndex:0];
NSString* part2 = [split objectAtIndex:1];
NSString* part3 = [split objectAtIndex:2];
part1 = [part1 substringToIndex:[part1 length] - 1];
part3 = [part3 substringFromIndex:1];

NSLog(part1);
NSLog(part2);
NSLog(part3);
0 голосов
/ 07 февраля 2012

Регулярное выражение, которое вы ищете: \\"(.*)\\"[ ^,]*|([^,]*),

в ObjC: (('\"' && string_1 && '\"' && 0-n spaces) || string_2 except comma) && comma

NSString *str = @"Christopher Bass,\"Cry, the Beloved Country ,Final Essay\",cbass@cgs.k12.va.us,som";
NSString *regEx = @"\\\"(.*)\\\"[ ^,]*|([^,]*),";
NSMutableArray *split = [[str componentsSeparatedByRegex:regEx] mutableCopy];
[split removeObject:@""]; // because it will print always both groups even if the other is empty
NSLog(@"%@", split);

// OUTPUT:
2012-02-07 17:42:18.778 tmpapp[92170:c03] (
    "Christopher Bass",
    "Cry, the Beloved Country ,Final Essay",
    "cbass@cgs.k12.va.us",
    som
)

RegexKitLite добавит обе строки в массив, поэтому вы получитес пустыми объектами для вашего массива.removeObject:@"" удалит их, но если вам нужно сохранить истинно пустые значения (например, ваш источник имеет val,,ue), вам нужно изменить код следующим образом:

str = [str stringByReplacingOccurrencesOfRegex:regEx withString:@"$1$2∏"];
NSArray *split = [str componentsSeparatedByString:@"∏"];

$ 1 и $ 2 - это те дваСтроки, упомянутые выше, ∏ в этом случае символ, который, скорее всего, никогда не появится в обычном тексте (и его легко запомнить: option-shift-p).

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