题 如何检查字符串是否包含Objective-C中的另一个字符串?


如何检查字符串(NSString)包含另一个较小的字符串

我希望有类似的东西:

NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);

但我能找到的最接近的是:

if ([string rangeOfString:@"hello"] == 0) {
    NSLog(@"sub string doesnt exist");
} 
else {
    NSLog(@"exists");
}

无论如何,这是找到一个字符串是否包含另一个字符串的最佳方法?


1143
2018-05-02 15:34


起源


我也希望看到它的添加,但同时在NSString上添加它作为一个类别相对容易。 - isaac
运用 if ([string rangeOfString:@"hello"] == 0) {...} NSRange和int存在类型不匹配错误。要解决这个问题,您应该将该行更改为以下内容: if ([string rangeOfString:@"hello"].length == 0) {...} - Neeku
iOS 8添加了containsString:这是一种添加iOS 7支持的微创方式 petersteinberger.com/blog/2014/... - Steve Moser
我从一开始就是一名iOS开发人员,我不断重温这篇文章,以便快速复制粘贴。我似乎无法记住这一个。我历史上访问量最多的stackoverflow帖子。 - VaporwareWolf


答案:


NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}

关键是要注意到这一点 rangeOfString: 返回一个 NSRange 结构,和 文件说 它返回结构 {NSNotFound, 0} 如果“干草堆”不包含“针”。


如果您使用的是iOS 8或OS X Yosemite,您现在可以: (*注意:如果在iOS7设备上调用此代码,这将使您的应用程序崩溃)。

NSString *string = @"hello bla blah";
if ([string containsString:@"bla"]) {
  NSLog(@"string contains bla!");
} else {
  NSLog(@"string does not contain bla");
}

 


2360
2018-05-02 16:20



要进行不区分大小写的搜索,请使用“if([string rangeOfString:@”bla“选项:NSCaseInsensitiveSearch] .location!= NSNotFound)” - Vanja
@Dave DeLong在我阅读你的编辑答案之前,我刚刚提到我为此目的创建的一个类别!由于我主要是一个c#开发人员,我很高兴他们为NSSTring添加了一个contains方法。 - dherrin79
如果我的部署目标是iOS7并且我使用containsString,为什么编译器没有说什么? - Ricardo
并进一步说明@Vanja的观点:如果你打算使用iOS 8 / Yosemite中引入的[string containsString]快捷键代码,你可以使用以下代码来表示不区分大小写的字符串:“[stringToSearch localizedCaseInsensitiveContainsString:string ]“,如果你想做一个案例和变音符号不敏感的搜索,那么这个:”[stringToSearch localizedStandardContainsString:string]“。 - Scott Kohlert
@ScottKohlert小心, [stringToSearch localizedStandardContainsString:string] 被引入 iOS9。 - Erzékiel


注意:这个答案现在已经过时了

为NSString创建一个类别:

@interface NSString ( SubstringSearch )
    - (BOOL)containsString:(NSString *)substring;
@end

// - - - - 

@implementation NSString ( SubstringSearch )

- (BOOL)containsString:(NSString *)substring
{    
    NSRange range = [self rangeOfString : substring];
    BOOL found = ( range.location != NSNotFound );
    return found;
}

@end

编辑:观察Daniel Galasko关于命名的评论 


155
2017-07-09 02:40



+1表示更清晰的结果代码和可重用性。我把它变成了一个班轮 return [self rangeOfString:substring].location != NSNotFound; 并将其包含在我的重构库es_ios_utils中。 github.com/peterdeweese/es_ios_utils - Peter DeWeese
看起来Apple喜欢你的想法并在iOS 8和OSx 10.10(Yosemite)中添加了这个功能,就像@DaveDeLong在他的回答中提到的那样。 +1 - Islam Q.
obj-c类别的基本规则是在方法名称前加上3个字母的模块前缀。这是一个完美的例子,因为它现在与iOS 7和10.10版本冲突 - Daniel Galasko


由于这似乎是谷歌的高排名结果,我想添加这个:

iOS 8和OS X 10.10添加了 containsString: 方法 NSString。这些系统的Dave DeLong示例的更新版本:

NSString *string = @"hello bla bla";
if ([string containsString:@"bla"]) {
    NSLog(@"string contains bla!");
} else {
    NSLog(@"string does not contain bla");
}

47
2018-06-08 21:14





NSString *myString = @"hello bla bla";
NSRange rangeValue = [myString rangeOfString:@"hello" options:NSCaseInsensitiveSearch];

if (rangeValue.length > 0)
{
    NSLog(@"string contains hello");
} 
else 
{
    NSLog(@"string does not contain hello!");
}

//您也可以使用以下内容:

if (rangeValue.location == NSNotFound) 
{
    NSLog(@"string does not contain hello");
} 
else 
{
    NSLog(@"string contains hello!");
}

35
2018-06-27 12:40





iOS 8 和 迅速, 我们可以用 localizedCaseInsensitiveContainsString  方法

 let string: NSString = "Café"
 let substring: NSString = "É"

 string.localizedCaseInsensitiveContainsString(substring) // true

21
2018-06-25 08:53



这很好。不知道为什么他们没有为ios 7提供这种方法 - Lucas
@Lucas,因为Swift推出了iOS 8.0。但是使用swift,您仍然可以使用iOS 7支持这些设备。 - Hemang


所以我个人真的很讨厌 NSNotFound 但要明白其必要性。

但有些人可能不了解与NSNotFound比较的复杂性

例如,这段代码:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if([string rangeOfString:otherString].location != NSNotFound)
        return YES;
    else
        return NO;
}

有它的问题:

1)显然是否 otherString = nil 这段代码会崩溃。一个简单的测试将是:

NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");

结果是 !!崩溃!!

2)对于Objective-c的新手来说,不那么明显的是,相同的代码不会在崩溃时崩溃 string = nil。 例如,这段代码:

NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");

而这段代码:

NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");

将导致

does string contains string - YES

这显然不是你想要的。

所以我认为更好的解决方案是使用rangeOfString返回长度为0的事实,这样一个更可靠的代码是这样的:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if(otherString && [string rangeOfString:otherString].length)
        return YES;
    else
        return NO;
}

或者简单:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    return (otherString && [string rangeOfString:otherString].length);
}

案件1和案件2将返回

does string contains string - NO

那是我的2美分;-)

请看看我的 要旨 更多有用的代码。


12
2017-08-06 06:36





改进版的 P i的解决方案,NSString上的一个类别,它不仅会告诉我,如果在另一个字符串中找到一个字符串,而且还通过引用获取范围,则:

@interface NSString (Contains)
-(BOOL)containsString: (NSString*)substring
              atRange:(NSRange*)range;

-(BOOL)containsString:(NSString *)substring;
@end

@implementation NSString (Contains)

-(BOOL)containsString:(NSString *)substring
              atRange:(NSRange *)range{

    NSRange r = [self rangeOfString : substring];
    BOOL found = ( r.location != NSNotFound );
    if (range != NULL) *range = r;
    return found;
}

-(BOOL)containsString:(NSString *)substring
{
    return [self containsString:substring
                        atRange:NULL];
}

@end

使用它像:

NSString *string = @"Hello, World!";

//If you only want to ensure a string contains a certain substring
if ([string containsString:@"ello" atRange:NULL]) {
    NSLog(@"YES");
}

// Or simply
if ([string containsString:@"ello"]) {
    NSLog(@"YES");
}

//If you also want to know substring's range
NSRange range;
if ([string containsString:@"ello" atRange:&range]) {
    NSLog(@"%@", NSStringFromRange(range));
}

11
2018-01-29 23:48





这是一个复制粘贴功能代码段:

-(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText
{
    return [StrText rangeOfString:StrSearchTerm 
        options:NSCaseInsensitiveSearch].location != NSNotFound;
}

8
2017-08-29 15:07



我可以知道为什么我被投票了吗?这是一个有效的代码片段 - Durai Amuthan.H


Oneliner(代码数量较少。干,因为你只有一个 NSLog):

NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 

6
2018-01-29 23:21





NSString *categoryString = @"Holiday Event";
if([categoryString rangeOfString:@"Holiday"].location == NSNotFound)
{
    //categoryString does not contains Holiday
}
else
{
    //categoryString contains Holiday
}

5
2017-07-08 10:44





尝试这个,

NSString *string = @"test Data";
if ([[string lowercaseString] rangeOfString:@"data"].location == NSNotFound) 
{
    NSLog(@"string does not contain Data");
}   
else 
{
    NSLog(@"string contains data!");
}

4
2017-09-02 09:48