как разбить строку на айфоне? - PullRequest
4 голосов
/ 13 января 2010

Я получил ниже значение (динамическое) с сервера:

drwxr-xr-x    9 0        0            4096 Jan 10 05:30 California

Теперь я хочу получить вот такую ​​оценку.

drwxr-xr-x
9
0
0
4096
Jan 10
05:30 
California

Пожалуйста, помогите мне в этом вопросе

Ответы [ 5 ]

8 голосов
/ 13 января 2010

Вы можете попробовать что-то вроде этого

NSArray * components = [initialString componentsSeparatedByString: @ ""];

4 голосов
/ 13 января 2010

См. NSString componentsSeparatedByString для вашего ответа.

2 голосов
/ 14 января 2010

Используйте регулярное выражение: RegexKitLite .

Это "полный пример" способа использования регулярных выражений для выполнения того, что вы хотите, с множеством объяснений, так что это немного длинный ответ. Используемое регулярное выражение - это всего лишь один из способов сделать это, и оно «вполне допустимо» в том, что оно принимает. Пример показывает:

  • Как сопоставить более одной строки / директории одновременно.
  • Возможный способ обработки разных форматов даты (Jan 10 05:30 и Apr 30 2009)
  • Как создать «массив массивов» совпадений.
  • Перебрать соответствующий массив и создать NSDictionary на основе проанализированных результатов.
  • Создание версии результатов с разделенными запятыми значениями.

Примечание: В этом примере некоторые длинные строки разбиты на несколько строк. Строковый литерал в форме @"string1 " @"string2" будет "автоматически" объединен компилятором для формирования строки, эквивалентной @"string 1 string2". Я отмечаю это только потому, что это может выглядеть немного необычно, если вы к этому не привыкли.

#import <Foundation/Foundation.h>
#import "RegexKitLite.h"

int main(int argc, char *argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSString *stringToMatch = 
    @"drwxr-xr-x    9 0        0            4096 Jan 10 05:30 California\n"
    @"-rw-r--r--    1 johne  staff     1335 Apr 30  2009 tags.m"; // A random entry from my machine with an "older" date.

  NSString *regex =
    @"(?m)^" // (?m) means: to "have ^ and $ match new line boundaries".  ^ means: "Match the start of a line".
    // Below, 
    // (...) means: "Capture for extraction the matched characters".  Captures start at 1, capture 0 matches "everything the regex matched".
    // [^\\p{Z}]+ says: "Match one or more characters that are NOT 'Separator' characters (as defined by Unicode, essentially white-space)".
    // In essence, '[^\\p{Z}]+' matches "One or more non-white space characters."
    // \\s+ says: Match one or more white space characters.
    // ([^\\p{Z}]+)\\s+ means: Match, and capture, the non-white space characters, then "gobble up" the white-space characters after the match.
    @"([^\\p{Z}]+)\\s+" // Capture 1 - Permission
    @"([^\\p{Z}]+)\\s+" // Capture 2 - Links (per `man ls`)
    @"([^\\p{Z}]+)\\s+" // Capture 3 - User
    @"([^\\p{Z}]+)\\s+" // Capture 4 - Group
    @"([^\\p{Z}]+)\\s+" // Capture 5 - Size
    @"(\\w{1,3}\\s+\\d+\\s+(?:\\d+:\\d+|\\d+))\\s+" // Capture 6 - The "date" part.
    // \\w{1,3} means: One to three "word-like" characters (ie, Jan, Sep, etc).
    // \\d+ means: Match one or more "digit-like" characters.
    // (?:...) means: Group the following, but don't capture the results.
    // (?:.A.|.B.) (the '|') means: Match either A, or match B.
    // (?:\\d+:\\d+|\\d+) means: Match either '05:30' or '2009'.
    @"(.*)$"; // Capture 7 - Name. .* means: "Match zero or more of any character (except newlines).  $ means: Match the end of the line.

  // Use RegexKitLites -arrayOfCaptureComponentsMatchedByRegex to create an
  // "array of arrays" composed of:
  // an array of every match of the regex in stringToMatch, and for each match,
  // an array of all the captures specified in the regex.

  NSArray *allMatchesArray = [stringToMatch arrayOfCaptureComponentsMatchedByRegex:regex];

  NSLog(@"allMatchesArray: %@", allMatchesArray);

  // Here, we iterate over the "array of array" and create a NSDictionary
  // from the results.

  for(NSArray *lineArray in allMatchesArray) {
    NSDictionary *parsedDictionary =
      [NSDictionary dictionaryWithObjectsAndKeys:
      [lineArray objectAtIndex:1], @"permission",
      [lineArray objectAtIndex:2], @"links",
      [lineArray objectAtIndex:3], @"user",
      [lineArray objectAtIndex:4], @"group",
      [lineArray objectAtIndex:5], @"size",
      [lineArray objectAtIndex:6], @"date",
      [lineArray objectAtIndex:7], @"name",
      NULL];
    NSLog(@"parsedDictionary: %@", parsedDictionary);
  }

  // Here, we use RegexKitLites -stringByReplacingOccurrencesOfRegex method to
  // create a new string. We use it to essentially transform the original string
  // in to a "comma separated values" version of the string.
  // In the withString: argument, '$NUMBER' means: "The characters that were matched
  // by capture group NUMBER."

  NSString *commaSeparatedString = [stringToMatch stringByReplacingOccurrencesOfRegex:regex withString:@"$1,$2,$3,$4,$5,$6,$7"];
  NSLog(@"commaSeparatedString:\n%@", commaSeparatedString);

  [pool release];
  pool = NULL;
  return(0);
}

Скомпилируйте и запустите с:

shell% gcc -Wall -Wmost -arch i386 -g -o regexExample regexExample.m RegexKitLite.m -framework Foundation -licucore
shell% ./regexExample
2010-01-14 00:10:38.868 regexExample[49409:903] allMatchesArray: (
        (
        "drwxr-xr-x    9 0        0            4096 Jan 10 05:30 California",
        "drwxr-xr-x",
        9,
        0,
        0,
        4096,
        "Jan 10 05:30",
        California
    ),
        (
        "-rw-r--r--    1 johne  staff     1335 Apr 30  2009 tags.m",
        "-rw-r--r--",
        1,
        johne,
        staff,
        1335,
        "Apr 30  2009",
        "tags.m"
    )
)
2010-01-14 00:10:38.872 regexExample[49409:903] parsedDictionary: {
    date = "Jan 10 05:30";
    group = 0;
    links = 9;
    name = California;
    permission = "drwxr-xr-x";
    size = 4096;
    user = 0;
}
2010-01-14 00:10:38.873 regexExample[49409:903] parsedDictionary: {
    date = "Apr 30  2009";
    group = staff;
    links = 1;
    name = "tags.m";
    permission = "-rw-r--r--";
    size = 1335;
    user = johne;
}
2010-01-14 00:10:38.873 regexExample[49409:903] commaSeparatedString:
drwxr-xr-x,9,0,0,4096,Jan 10 05:30,California
-rw-r--r--,1,johne,staff,1335,Apr 30  2009,tags.m
2 голосов
/ 13 января 2010

Как уже упоминалось, вы можете использовать NSString's функцию-член componentsSeparatedByString: или componentsSeparatedByCharactersInSet:

В качестве альтернативы (для более мощного токенизации) загляните в класс Objective-C NSScanner в фундаментальной структуре Mac OS X.

Вы можете сделать что-то вроде этого:

NSString *str = "drwxr-xr-x    9 0  ... ";
NSScanner *scanner = [NSScanner scannerWithString:str];

Чтобы получить каждый токен в строковой форме, используйте NSScanner's scanUpToCharactersFromSet:intoString: функцию-член.

NSString *token = [NSString string];
NSCharacterSet *div = [NSCharacterSet whitespaceCharacterSet];
[scanner scanUpToCharactersFromSet:div intoString:token];
// token now contains @"drwxr-xr-x"

Последующие вызовы вышеуказанного вернут 9, 0 и т. Д.

Примечание: приведенный выше код не был проверен.

2 голосов
/ 13 января 2010
[myStringValue componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

также может быть полезным.

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