如何获取NSString的子字符串?


78

如果我想从NSString中获取一个值@"value:hello World:value",应该怎么用?

我想要的返回值为@"hello World"



由于您不清楚您要问什么,我正在投票结束这个问题。此处完全没有指示。你只想回来"hello World"吗? return @"hello World"。您是否只想返回冒号之间的内容?您是否要剥离最左边的结肠左侧的所有内容和最右边的结肠右侧的所有内容?这个问题没有明确定义的输入-输出标准(正如我们看到的结果列表一样,这些问题都可以通过各种方法解决该问题)。
nhgrif

Answers:


158

选项1:

NSString *haystack = @"value:hello World:value";
NSString *haystackPrefix = @"value:";
NSString *haystackSuffix = @":value";
NSRange needleRange = NSMakeRange(haystackPrefix.length,
                                  haystack.length - haystackPrefix.length - haystackSuffix.length);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle); // -> "hello World"

选项2:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)];
NSRange needleRange = [match rangeAtIndex: 1];
NSString *needle = [haystack substringWithRange:needleRange];

不过,对于您这个微不足道的案例来说,这可能有点过高。

选项3:

NSString *needle = [haystack componentsSeparatedByString:@":"][1];

这将在拆分时创建三个临时字符串和一个数组。


所有代码段均假定搜索的内容实际上包含在字符串中。


它在NSAnchoredSearch上哭了……也许NSMatchingAnchored更好。
乔尼

74

这是一个不太复杂的答案:

NSString *myString = @"abcdefg";
NSString *mySmallerString = [myString substringToIndex:4];

另请参见substringWithRange和substringFromIndex


1
抱歉,这不能回答问题(如何从字符串中间获取子字符串)。
Monolo 2013年

那会返回什么
Chicowitz

16

这是一个简单的功能,可让您执行所需的操作:

- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator
{
    NSRange firstInstance = [value rangeOfString:separator];
    NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator];
    NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location);

    return [value substringWithRange:finalRange];
}

用法:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"];

1
如果有启发性,我可以告诉您我投票赞成其他答案的理由。我宁愿写两行而不是六行。
Le Mot Juiced

2
问题在于,这两行代码只能解决任何人都不存在的特定情况,甚至对提出要求的人也可能不存在。
加里特

getSubstring:…应该substringInString:…在不向其传递子字符串的情况下调用,get…并且通常应将以开头的方法传递给要写入的缓冲区指针。substringFromIndex:创建一个中间子字符串,这是不必要的rangeOfString:options:range:。最后,通过将一个不安全的代码段包装在一个一般的方法中,您可以掩盖一个错误:如果分隔符在字符串中存在一次或更少次,您将获得超出范围的异常。
后悔2014年


12

这是@Regexident选项1和@Garett答案的一个小组合,可以在前缀和后缀之间使用一个功能强大的字符串切割器,上面有更多...更多单词。

NSString *haystack = @"MOREvalue:hello World:valueANDMORE";
NSString *prefix = @"value:";
NSString *suffix = @":value";
NSRange prefixRange = [haystack rangeOfString:prefix];
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix];
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle);

现在这有效!我尝试了Regixident的选项1,它对我不起作用。我不知道为什么。我一直在寻找一种解决方案,以<i></i>在项目中的标签内获取字符串以使这些字符串变为斜体。:)
Glenn Posadas '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.