NSStringが特定の他の文字列で始まるかどうかを確認する方法は?


152

URLとして使用する文字列がhttpで始まるかどうかを確認しようとしています。現在確認しようとしている方法が機能していないようです。これが私のコードです:

NSMutableString *temp = [[NSMutableString alloc] initWithString:@"http://"];
if ([businessWebsite rangeOfString:@"http"].location == NSNotFound){
    NSString *temp2 = [[NSString alloc] init];
    temp2 = businessWebsite;
    [temp appendString:temp2];
    businessWebsite = temp2;
    NSLog(@"Updated BusinessWebsite is: %@", businessWebsite);
}

[web setBusinessWebsiteUrl:businessWebsite];

何か案は?

回答:


331

これを試してください:if ([myString hasPrefix:@"http"])

ちなみに、あなたのテストはの!= NSNotFound代わりにすべきです== NSNotFound。ただし、URLがftp://my_http_host.com/thingであるとすると、一致しますが一致しません。


そうだね。私は以前に!=に気づくべきでしたが、結局はhasPrefixが機能しました。アドバイスありがとうございます。正解になり次第、正解としてマークします。
Rob

23

私はこの方法を使いたいです:

if ([[temp substringToIndex:4] isEqualToString:@"http"]) {
  //starts with http
}

またはさらに簡単:

if ([temp hasPrefix:@"http"]) {
    //do your stuff
}

1
それもいいです。この方法も少し柔軟です。コメントをありがとう
Rob

2
これは、一時文字列が5文字未満の場合にクラッシュします。インデックスは0から始まります。したがって、これは良い答えではありません。また、この例には文字数の不一致があります。「http」には5文字が含まれていません。大文字と小文字の区別も考慮する必要があります。
Daniel

@ダニエル何言ってるの?なぜ5?これはNSArrayではありません...インデックス4は5番目ではなく4番目の文字です!そして、あなたは今までにHttpまたはhTtPを見たことがありますか?大文字と小文字の区別は関係ありません。また、問題は、文字列が4文字より短いことではなく、文字列がhttpで始まるかどうかを確認することでした。hasPrefix:の方が優れていますが、これも同様に機能します。泣き言を
やめる

3
@JonasG-はい、substringToIndexの動作は正しいです。ただし、インデックス4は実際には5番目の文字です。インデックス0が最初の文字です。substringToIndexにインデックスで指定された文字が含まれていると誤って想定していましたが、含まれていません。大文字と小文字の区別は、ユーザー入力が含まれる場合に関係します。これは、質問が示唆していると思います。「HTTP:// WWW ...」の場合を考えてみましょう。しかし、最大の問題は、提案されたソリューションが「ftp」または4文字未満の文字列を検出したときに例外をスローすることです。hasPrefixメソッドにも同じ問題はありません。
Daniel

6

「http:」をチェックしている場合は、おそらく大文字と小文字を区別しない検索が必要です。

NSRange prefixRange = 
    [temp rangeOfString:@"http" 
                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)

2

Swiftバージョン:

if line.hasPrefix("#") {
  // checks to see if a string (line) begins with the character "#"
}

なぜこれが反対票が投じられたのかはわかりません...これはSwiftの簡単な方法です。ほとんどの新しいiOS開発者は、これからSwiftを使用することになるでしょう。OPは、Objective-Cの回答のみが要求されたとは決して言っていません。
Richard

「なぜこれが反対票だったのかわからない」-おそらく構文が間違っているためでしょうか?if line.hasPrefix("prefix"){} `である必要があります
superarts.org

1
より単純な構文を指摘していただきありがとうございますが、ifステートメントの周りに()を配置することは悪い構文ではありません。私たちの一部の古いタイマーでは、よりはっきりと読み、まったく同じように機能します。 if (line.hasPrefix("#")) {}同様に動作します。
Richard

-1

これが私の問題の解決策です。不要な文字は削除され、大文字と小文字は区別されません。

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self generateSectionTitles];
}

-(NSArray *)generateSectionTitles {

    NSArray *alphaArray = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];

    NSMutableArray *sectionArray = [[NSMutableArray alloc] init];

    for (NSString *character in alphaArray) {



        if ([self stringPrefix:character isInArray:self.depNameRows]) {
            [sectionArray addObject:character];
        }

    }

    return sectionArray;

}

-(BOOL)stringPrefix:(NSString *)prefix isInArray:(NSArray *)array {

    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:prefix options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return TRUE;
        }

    }

    return FALSE;

}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

    NSInteger newRow = [self indexForFirstChar:title inArray:self.depNameRows];
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
    [tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

    return index;
}

// Return the index for the location of the first item in an array that begins with a certain character
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
    NSUInteger count = 0;
    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:character options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return count;
        }
        count++;
    }
    return 0;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.