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
그것도 좋습니다. 이 방법은, 주석 주셔서 감사합니다 좀 더 유연한뿐만 아니라입니다

2
임시 문자열이 5 자 미만인 경우 충돌이 발생합니다. 인덱스는 0부터 시작합니다. 따라서 좋은 대답이 아닙니다. 또한이 예에는 문자 수가 일치하지 않습니다. "http"에는 5자가 없습니다. 대소 문자를 구분하지 않는 것도 고려해야합니다.
Daniel

@Daniel 당신은 무엇을 말하는가? 왜 5입니까? 이것은 NSArray가 아닙니다 ... 인덱스 4는 5 번째가 아닌 4 번째 문자입니다! 그리고 Http 또는 hTtP를 본 적이 있습니까? 대소 문자 구분은 관련이 없습니다. 또한 문자열이 4 자보다 짧은 문자열이 아니라 http로 시작하는지 확인하는 것이 중요합니다. hasPrefix :가 더 낫지 만 이것은 잘 작동합니다. 징징 그만
JonasG

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

스위프트 버전 :

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

왜 이것이 투표에 실패했는지 모르겠습니다 ... 이것은 간단한 Swift 방법입니다. 대부분의 새로운 iOS 개발자는 아마도 여기서부터 스위프트를 사용할 것입니다. 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.