2012-04-27 4 views
1

문자열이 있는데 "#"으로 시작하고 "."로 끝나는 단어 (태그)를 검색하고 싶습니다. 또는 ","또는 ""나는이 온라인을 찾았지만, 때문에 제한됩니다 - (더 많은 단어가 있지만) 당신은 문자열에서 한 단어를 찾을 수 있습니다 - "RangeOfString"여러 선택문자열의 검색 태그

NSString *stringText = @"test #hello #world"; 
NSString *result = nil; 

// Determine "#" 
NSRange hashRange = [stringText rangeOfString:@"#" options:NSCaseInsensitiveSearch]; 
if (hashRange.location != NSNotFound) 
{ 
    // Determine " " location according to "#" location 
    NSRange endHashRange; 

    endHashRange.location = hashRange.length + hashRange.location; 
    endHashRange.length = [stringText length] - endHashRange.location; 
    endHashRange = [stringText rangeOfString:@" " options:NSCaseInsensitiveSearch range:endHashRange]; 

    if (endHashRange.location != NSNotFound) 
    { 
     // Tags found: retrieve string between them 
     hashRange.location += hashRange.length; 
     hashRange.length = endHashRange.location - hashRange.location; 

     result = [stringText substringWithRange:hashRange]; 
    } 
} 
을 허용하지 않습니다

어떻게하면됩니까?

감사합니다.

답변

2

당신은이 같은 NSRegularExpression 클래스를 사용할 수 있습니다 다음은 테스트되지 않은 예입니다. 내가 좋아했던 레퍼런스는 애플 클래스가 지원하는 정규 표현식의 문법을 설명한다.

+0

고마워요,하지만 경기에서 추측 할 수는 없습니다. 그는 적절한 수의 단어를 반환하지만 단어가 아닌 코드를 반환합니다. – Vins

+0

@Vins 편집을 살펴보면, 이것은'matches' 배열에서 실제 문자열을 얻는 방법을 명확히해야합니다. – dasblinkenlight

+0

와우! 고마워요! – Vins

1

NSRegularExpression을 사용해야합니다. 일치하는 항목이 여러 개 있습니다. 당신은 그것을 바로 얻을 수 있도록 정규 표현식 함께 플레이 할 수도 있습니다

NSError *error = NULL; 
NSRegularExpression *tags = [NSRegularExpression 
    regularExpressionWithPattern:@"[#]([^, .]+)([, .]|$)" 
    options:NSRegularExpressionCaseInsensitive 
    error:&error]; 
NSArray *matches = [tags matchesInString:str options:0 range:NSMakeRange(0, str.length)]; 

for (NSTextCheckingResult *match in matches) { 
    NSLog(@"%@", [str substringWithRange:[match rangeAtIndex:1]]); 
} 

:

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b(#\\S*[.,])\\b" options:NSRegularExpressionCaseInsensitive]; 
int numberOfMatches = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, string.length)]; 
NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; 
+0

감사합니다,하지만 난 경기에서 추정 할 수 없다. 그는 적절한 수의 단어를 반환하지만 단어가 아닌 코드를 반환합니다. – Vins

1

NSScanner를 사용하고 싶을 것입니다.

NSString *stringText = @"test #hello #world"; 
NSString *result = nil; 
NSCharacterSet *endingChars = [NSCharacterSet characterSetWithCharactersInString:@"., "]; 

NSScanner *scanner = [NSScanner scannerWithString:stringText]; 
scanner.charactersToBeSkipped = nil; 

[scanner scanUpToString:@"#" intoString:NULL]; 
[scanner scanString:@"#" intoString:NULL]; 
[scanner scanUpToCharactersFromSet:endingChars intoString:&result]; 
[scanner scanCharactersFromSet:endingChars intoString:NULL]; 

STAssertEqualObjects(result, @"hello", nil); 

그 시점에서 [스캐너 isAtEnd]까지 반복됩니다.


NSString *stringText = @"test #hello #world"; 
NSString *match = nil; 
NSMutableArray *results = [NSMutableArray arrayWithCapacity:2]; 
NSCharacterSet *endingChars = [NSCharacterSet characterSetWithCharactersInString:@"., "]; 

NSScanner *scanner = [NSScanner scannerWithString:stringText]; 
scanner.charactersToBeSkipped = nil; 

while (![scanner isAtEnd]) { 
    [scanner scanUpToString:@"#" intoString:NULL]; 
    [scanner scanString:@"#" intoString:NULL]; 
    [scanner scanUpToCharactersFromSet:endingChars intoString:&match]; 
    [scanner scanCharactersFromSet:endingChars intoString:NULL]; 
    [results addObject:match]; 
} 

STAssertEquals(results.count, 2, nil); 
STAssertEqualObjects([results objectAtIndex:0], @"hello", nil); 
STAssertEqualObjects([results objectAtIndex:1], @"world", nil); 
+0

루프를 만들고 모든 단어를 정확하게 얻을 수있는 방법은 무엇입니까? 감사합니다. – Vins

+0

OK, 샘플 유닛 테스트를 업데이트했습니다. –