2010-01-13 80 views
4

我有以下从服务器值(动态):如何在iPhone上分割字符串?

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

现在我想VALU这样。

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

请帮我这个问题

+0

根据您的格式,我会说“值=价值” ;-) – 2010-01-13 11:48:57

+0

我的意思是,我想下面的格式。 drwxr-xr-x,9,0,0,4096,Jan 10,05:30,加州 – 2010-01-13 11:51:00

+0

添加了代码标签。 – 2010-01-13 11:51:32

回答

2

正如其他人所说,你可以使用NSString's成员函数componentsSeparatedByString:componentsSeparatedByCharactersInSet:

作为替代(更强大的符号化),看看Objective-C的NSScanner类在Mac OS X

的基础框架

你可以做这样的事情:

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

为了获得字符串形式每个令牌,使用NSScanner'sscanUpToCharactersFromSet:intoString:个成员函数。

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

对上述的后续调用将返回9,0等等。

注意:上面的代码尚未经过测试。

8

你可以尝试水木清华这样

的NSArray *组件= [initialString componentsSeparatedByString:@”“];

+0

“Jan”和“10”之间不会分裂吗? – Sakkle 2010-01-13 11:52:22

+0

它会,但你怎么处理这种情况下的通用方式?如果需要的话,看起来更容易将组件组合起来 – Vladimir 2010-01-13 11:58:10

2
[myStringValue componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

也可能有用。

2

使用正则表达式:RegexKitLite

这是一个使用正则表达式来完成你想要的大量解释的“完整示例”,所以这是一个很长的答案。所使用的正则表达式只是这样做的一种方式,对于它所接受的“相当宽松”。示例显示:

  • 如何一次匹配多个“一行/目录”。
  • 一种可能的方式来处理不同的日期格式(Jan 10 05:30Apr 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