文字列(NSString
)に別の小さい文字列が含まれているかどうかを確認する方法はありますか。
私は以下のようなものを望んでいました:
NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);
しかし私が見つけることができた最も近いものは次のとおりです。
if ([string rangeOfString:@"hello"] == 0) {
NSLog(@"sub string doesnt exist");
}
else {
NSLog(@"exists");
}
とにかく、ある文字列に別の文字列が含まれているかどうかを調べる最も良い方法はありますか?
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
NSLog(@"string does not contain bla");
} else {
NSLog(@"string contains bla!");
}
重要なのは、rangeOfString:
がNSRange
構造体を返すこと、そして ドキュメントによると "haystack"が "needle"を含まない場合は{NSNotFound, 0}
構造体を返すことです。
IOS 8またはOS X Yosemiteを使用している場合は、次の操作を実行できます。 (*注:このコードがiOS 7デバイスで呼び出されると、アプリケーションがクラッシュします)。
NSString *string = @"hello bla blah";
if ([string containsString:@"bla"]) {
NSLog(@"string contains bla!");
} else {
NSLog(@"string does not contain bla");
}
(これはSwiftでも同様に機能します)
????
注:この回答は現在使用されていません
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のコメントを観察しなさい
これはグーグルでの上位の結果であるように思われるので、私はこれを加えたいです:
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");
}
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!");
}
iOS 8 および Swift では、localizedCaseInsensitiveContainsString
メソッドを使用できます
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
個人的には私は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セントです;-)
私の 要旨 をチェックして、もっと役に立つコードを見つけてください。
NSStringのカテゴリである P i の解決策 の改良版で、文字列が別の文字列内に見つかった場合だけでなく、参照によって範囲も指定されます。
@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));
}
これがコピーアンドペースト機能の断片です。
-(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText
{
return [StrText rangeOfString:StrSearchTerm
options:NSCaseInsensitiveSearch].location != NSNotFound;
}
Oneliner(コード量が少なく、DRY、NSLog
は1つしかないので)
NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla");
NSString *categoryString = @"Holiday Event";
if([categoryString rangeOfString:@"Holiday"].location == NSNotFound)
{
//categoryString does not contains Holiday
}
else
{
//categoryString contains Holiday
}
最善の解決策。これと同じくらい簡単! Wordまたは文字列の一部を見つけたい場合このコードを使うことができます。この例では、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");
}
これを試して、
NSString *string = @"test Data";
if ([[string lowercaseString] rangeOfString:@"data"].location == NSNotFound)
{
NSLog(@"string does not contain Data");
}
else
{
NSLog(@"string contains data!");
}
Swiftの場合、これを使うことができます
let string = "Package #23"
if string.containsString("Package #") {
//String contains substring
}
else {
//String does not contain substring
}
Swift 4では:
let a = "Hello, how are you?"
a.contains("Hello") //will return true
あなたがこれを一度必要とするならば、書いてください:
NSString *stringToSearchThrough = @"-rangeOfString method finds and returns the range of the first occurrence of a given string within the receiver.";
BOOL contains = [stringToSearchThrough rangeOfString:@"occurence of a given string"].location != NSNotFound;
大文字と小文字を区別する文字列を気にしないでください。一度試してみてください。
NSString *string = @"Hello World!";
if([string rangeOfString:@"hello" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
NSLog(@"found");
}
else
{
NSLog(@"not found");
}
RangeOfString:optionsと一緒にNSCaseInsensitiveSearchオプションを使用します。
NSString *me = @"toBe" ;
NSString *target = @"abcdetobe" ;
NSRange range = [target rangeOfString: me options: NSCaseInsensitiveSearch];
NSLog(@"found: %@", (range.location != NSNotFound) ? @"Yes" : @"No");
if (range.location != NSNotFound) {
// your code
}
出力結果が見つかりました:Yes
オプションは一緒に "or"することができ、以下を含みます。
NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearchなど
このコードを使ってください
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound)
{
NSLog(@"string does not contain bla");
}
else
{
NSLog(@"string contains bla!");
}
最初の文字列に2番目の文字列が含まれているかどうか
NSString *first = @"Banana";
NSString *second = @"BananaMilk";
NSRange range = [first rangeOfString:second options:NSCaseInsensitiveSearch];
if (range.length > 0) {
NSLog(@"Detected");
}
else {
NSLog(@"Not detected");
}
スイフト4以上
let str = "Hello iam midhun"
if str.contains("iam") {
//contain substring
}
else {
//doesn't contain substring
}
これを試して:
Swift 4.1、4.2:
let stringData = "Black board"
//Swift quick way and case sensitive
if stringData.contains("bla") {
print("data contains string");
}
//case sensitive
if stringData.range(of: "bla",options: .caseInsensitive) != nil {
print("data contains string");
}else {
print("data does not contains string");
}
Objective-Cの場合:
NSString *stringData = @"Black board";
//Quick way and case sensitive
if ([stringData containsString:@"bla"]) {
NSLog(@"data contains string");
}
//Case Insensitive
if ([stringData rangeOfString:@"bla" options:NSCaseInsensitiveSearch].location != NSNotFound) {
NSLog(@"data contains string");
}else {
NSLog(@"data does not contain string");
}