2012-04-30 47 views
2

虽然iOS提供了很多有用的字符串方法,但我无法找到一个很好的解决方案来获取由给定字符分隔的字符串范围。NSString内部查找范围用字符串分隔

原始字符串:

|您|将|实现|你想要的一切|如果你|工作|硬

分隔字符是|

分开字符串1:你(范围:3,3)

分开字符串2:实现(范围:12,7)

单独STRING3:想(范围:37,4)

单独string4:work(range:51,4)

NSString方法的substringFromIndex:可以使用NSString查找这些范围,但这看起来效率不高。

请让我知道更好的方法来解决这个问题。

+0

的NSString的方法有出于这样的目的。您不必担心性能:它们已经足够优化。顺便说一下,考虑使用'rangeOfString:'。 – 2012-04-30 14:18:14

回答

3

您应该使用NSRegularExpressionmatchesInString:options:range:方法。

返回值

NSTextCheckingResult对象的数组。每个结果 通过其范围属性给出整体匹配范围,并通过其rangeAtIndex:方法给出每个单独捕获组的范围 。如果其中一个捕获组不参与此特定匹配,则返回 范围{NSNotFound,0}。

你可能有这样的代码:

NSString *str = @"|You| will |achieve| everything you |want| if you |work| hard"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: 
    @"[^|]*" options: 0 error:nil]; 
NSArray *results = [regex matchesInString:str 
            options:0 
            range:NSMakeRange(0, [str length])]; 
// ... do interesting code on results... 
// Note that you should iterate through the array and use the 'range' property 
// to get the range. 

for (NSTextCheckingResult *textResult in results) 
{ 
    if (textResult.range.length > 0) 
    { 
     NSString *substring = [myStr substringWithRange:textResult.range]; 
     NSLog(@"string at range %@ :: \"%@\"", 
      NSStringFromRange(textResult.range), 
      substring); 
    } 
} 

日志:

串在范围{1,3} :: “你”

串在范围{5, 6} ::“will”

范围为{12,7}的字符串::“达到”

串在范围{20,16} :: “一切你”

串在范围{37,4} :: “想要” 在范围

串{42,8} ::“如果你 “

串在范围{51,4} :: ”工作“

串在范围{56,5} ::” 硬”

+0

哇,这种方法是我想要的。非常非常感谢你。 – eon

+0

不应该是“@”\ |([^ |] *)\ |“'的正则表达式吗?这应该只返回被要求的4个子字符串。您需要使用' - [NSTextCheckingResult rangeAtIndex:1];'来获取捕获组的范围,因为' - [NSTextCheckingResult range];'将包含管道。 –

+0

@JustinAnderson你可以这样做,但是你必须确保每个结果都以管道开始和结束(不一定是这种情况)。您还需要按照您的指示修改范围,但它可以消除我的答案适合的空范围匹配。当我尝试你的表达时,我得到了“你”“实现”“想要”“工作”。我修改了你的表达式,以便不在末尾包含管道::'@“\\ |([^ |] *)”'现在返回所有内容并且没有我的结果包含的空条目。我认为你的表达(修改)是更好的,如果输入是在这种格式。 – Sam