2010-03-13 4 views
0

하나의 NSString에 대해 N 패턴 문자열이 있습니다. 나는 "패턴 일치"부분 문자열을 추출하고 싶습니다.Objective C에서 여러 패턴 주위에있는 텍스트의 여러 부분 문자열을 추출하는 가장 좋은 방법은 무엇입니까?

그래서 "빠른 여우는 게으른 개로 뛰어"내 패턴은 "갈색"과 "게으른"나는 "빠른 갈색 여우"와 "게으른 개"를 얻고 싶습니다. 그러나 부분 문자열은 반드시 공백으로 구분할 필요는 없습니다.

또 다른 예는 텍스트의 여러 단락이 있고 텍스트에서 "빨간색"과 "파란색"의 모든 인스턴스를 찾고 싶지만 문맥에 "빨간색"과 "파란색"의 인스턴스를 표시하려고하는 경우입니다 , 그러나 "문맥"에 의해 문맥이 텍스트 본문의 단어의 시작이나 끝으로 시작하고 끝나면 상관하지 않으므로 텍스트 본문 중 하나가 "전체가 많이 있습니다 나무에있는 빨간 오리의 결과 "는"빨간 오리의 전체가 많다 "또는"빨간 오리가 많다 "는 결과가 될 수 있으며 문제가되지 않습니다. 공백을 기반으로하는 해결책을 찾고 있지 않습니다. 그것은 단지 "red"를 찾고 "red"와 10 문자 전후 10 문자 사이의 부분 문자열을 얻을 수 있습니다.

즉, "범위"기반 문자열 일치 기능이 있습니다. 한 번에 여러 문자열을 일치시키고 각 문자열의 일치 지점과 주변 문자를 반환하는 쉬운 방법이 있었으면합니다.

+0

에 일치하는 15 자

  • "(\w+\W+){,4}("
  • , ")(\W+\w+){,4}"에 일치하는. 당신이 준 예제는 "패턴"이 패턴 텍스트에서 하나 이상의 공백으로 구분 된 텍스트를 반환한다는 것입니다. 그러나 공백 문자로 구분하지 않으면 무엇을 반환해야하는지 어떻게 알 수 있습니까? – Chuck

    +0

    이 더 명확하게 편집되었습니다. – Matt

    답변

    3

    당신이 정규 표현식에 의해 제공 사용할 수 있습니다 타사 프레임 워크 (예 : RegexKit 또는 RegexKitLite). RE를 만들려면 join "|" 문맥을 잡기 위해 괄호와 패턴을 앞에 붙이고 추가하십시오. Match 정규 표현식에 대한 문자열입니다.

    몇 가지 예를 접두사 & 접미사 패턴

    • ".{,15}(", ").{,15}" 4 개 단어
    • 이 underspecified 보인다
    +1

    RegexKitLite에 대한 제 투표를 추가하십시오. 결과를 일치하는 캡처 구성 요소의 배열 또는 일치하는 구성 요소가있는 문자열의 위치를 ​​알려주는 범위의 배열로 얻을 수 있습니다. 그것은 당신이 요구하는 모든 것을 할 수 있어야합니다. – VictorB

    6

    원하는 것은 NSScanner입니다. 더 큰 문자열에서 임의의 문자열을 찾으려면, 당신은 같은 것을 할 : 컨텍스트를 얻으려면

    NSString *scannedString = nil; 
    NSScanner *scanner = [NSScanner scannerWithString:@"The quick brown fox jumped over the lazy dog"]; 
    [scanner scanUpToString:@"brown" intoString:&scannedString]; 
    // scannedString is now @"The quick " and the scanner's location is right before "brown" 
    

    을, 당신은 "브라운은"당신이에 포함 할 발견 된 위치 주위에 얼마를 결정해야합니다 당신의 결과.

    항상 단어를 찾을 때 대체 방법으로 NSString의 componentsSeparatedByString:을 사용하여 배열을 가져온 다음 요소 + x 주위에 많은 요소를 반환 할 수 있습니다. 예를 들어 :

    NSArray *words = [@"The quick brown fox jumped over the lazy dog" componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]; 
    NSUInteger wordLocation = [words indexOfObject:@"brown"]; 
    NSString *wordInContext = [[words subarrayWithRange:NSMakeRange(brownlocation-2, brownLocation+2)] componentsJoinedByString:@" "]; 
    

    (여기서는 모든 예제가 필요한 오류 검사를 부족하지만, 당신이 이런 일을 할 수있는 방법에 대한 아이디어를주고 그냥.)

    관련 문제