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

Jon*_*an. 1200 string substring objective-c range ios

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

我希望有类似的东西:

NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dav*_*ong 2425

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

关键是要注意rangeOfString:返回一个NSRange结构,并且文档说它返回结构,{NSNotFound, 0}如果"haystack"不包含"needle".


如果您使用的是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");
}
Run Code Online (Sandbox Code Playgroud)

  • 要进行不区分大小写的搜索,请使用"if([string rangeOfString:@"bla"选项:NSCaseInsensitiveSearch] .location!= NSNotFound)" (284认同)
  • 并进一步说明@Vanja的观点:如果你打算使用iOS 8/Yosemite中引入的[string containsString]快捷键代码,你可以使用下面的代码来表示不区分大小写的字符串:"[stringToSearch localizedCaseInsensitiveContainsString:string ]",这个如果你想做一个案例和变音符号不敏感搜索:"[stringToSearch localizedStandardContainsString:string]". (2认同)

P i*_*P i 158

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

为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
Run Code Online (Sandbox Code Playgroud)

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

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

Luk*_*kas 53

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

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");
}
Run Code Online (Sandbox Code Playgroud)


AJS*_*AJS 39

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!");
}
Run Code Online (Sandbox Code Playgroud)

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

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


iGo*_*iGo 22

使用iOS 8Swift,我们可以使用localizedCaseInsensitiveContainsString 方法

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

 string.localizedCaseInsensitiveContainsString(substring) // true
Run Code Online (Sandbox Code Playgroud)


uca*_*tit 13

所以我个人非常讨厌,NSNotFound但要了解它的必要性.

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

例如,这段代码:

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

有它的问题:

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

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

结果是 !!崩溃!!

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

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

而这段代码:

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

将导致

does string contains string - YES
Run Code Online (Sandbox Code Playgroud)

这显然不是你想要的.

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

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

或者简单:

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

案件1和案件2将返回

does string contains string - NO
Run Code Online (Sandbox Code Playgroud)

那是我的2美分;-)

请查看我的Gist以获取更多有用的代码.


Vik*_*ica 12

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
Run Code Online (Sandbox Code Playgroud)

使用它像:

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));
}
Run Code Online (Sandbox Code Playgroud)


Dur*_*n.H 8

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

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


jer*_*rik 6

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

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


Ada*_*Ada 6

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


小智 5

试试这个,

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


han*_*som 5

最佳方案.就这么简单!如果要查找字符串或单词的一部分.您可以使用此代码.在这个例子中,我们将检查word的值是否包含"acter".

NSString *word =@"find a word or character here";
if ([word containsString:@"acter"]){
    NSLog(@"It contains acter");
} else {
     NSLog (@"It does not contain acter");
}
Run Code Online (Sandbox Code Playgroud)


Ank*_*arg 5

在Swift 4中:

let a = "Hello, how are you?"
a.contains("Hello")   //will return true
Run Code Online (Sandbox Code Playgroud)