2017-12-19 3 views
-1

나는 문자열이문자열의 전체 범위에 대해 문자열에서 하위 문자열을 추출하여 배열에 넣는 방법은 무엇입니까?

NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"

내가 ["2 2","5 6 7 8 9 1 2 3","1 2","5 6 7 8 9 1 2 3"]

같은 문자열의 배열에 원하는 내가 발견 ["M":"2 2", "C":"5 6 7 8 9 1 2 3"]

같은 사전의 유형을 매핑 할 것이 가능해야 범위 속성을 사용하여 부분 문자열을 가져 오려면

NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3" 

NSRange r1 = [str rangeOfString:@"M"]; 
NSRange r2 = [str rangeOfString:@"C"]; 
NSRange rSub = NSMakeRange(r1.location + r1.length, r2.location - r1.location - r1.length); 
NSString *sub = [s substringWithRange:rSub]; 

그러나 문자 M과 C는 임의의 순서로 있습니다. 문자열의 전체 길이에 대해이를 어떻게 해결할 수 있으며 배열에 넣을 수 있습니까?

+0

문자열이 동적입니까? 나는 어떤 편지라도 될 수 있거나 M과 C가되어야 함을 의미합니까? –

+0

"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"에 대한 정확한 결과는 "사전의 유형과 맵핑"의 관점에서 무엇이되어야합니까? 다음 문자열에는 'M'이 두 개 포함되어 있으며 사전에 하나의 'M'만 키로 사용할 수 있습니다. –

+2

기다려라. 당신이 말하기를 '나는 ""2 2 ","5 6 7 8 9 1 2 3 ","1 2 ","5 6 7 8 9 1 2 3 "과 같은 하위 문자열 배열을 원한다. "나는"[ "M": "2 2", "C": "5 6 7 8 9 1 2 3"]'과 같은 사전의 유형으로 매핑하려고합니다. 배열과 사전은 어떻게 관련이 있습니까? Arun이 지적했듯이 샘플 데이터에 "M"이라는 키가 두 번 있지만 사전 키는 고유합니다 –

답변

1

근무 솔루션 :

NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"([A-Z])([\\d\\s]*)" options:0 error:nil]; 

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 

[regex enumerateMatchesInString:str options:0 range:NSMakeRange(0, [str length]) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { 
    NSString *letter = [str substringWithRange:[result rangeAtIndex:1]]; 
    NSString *numbers = [str substringWithRange:[result rangeAtIndex:2]]; 
    NSMutableArray *subArray = dict[letter]?dict[letter]:[[NSMutableArray alloc] init]; 
    [subArray addObject:numbers]; 
    [dict setObject:subArray forKey:letter]; 
}]; 

NSLog(@"Dict: %@", dict); 

출력 :

$>Dict: { 
    C =  (
     " 5 6 7 8 9 1 2 3", 
     " 5 6 7 8 9 1 2 3" 
    ); 
    M =  (
     " 2 2 ", 
     " 1 2 " 
    ); 
} 

작동 원리 :
우리는 "문자 + anyamountof (모든 공간 + 숫자)"의 그룹을 찾기 위해으로 RegularExpression를 사용합니다.
패턴에 여분의 괄호를 사용하여 "그룹"을 정의합니다.
일치 항목을 나열하고 그룹 earliers를 정의 했으므로 NSTextCheckingResultrangeAtIndex:을 사용하여 쉽게 문자와 숫자를 얻을 수 있습니다.
그런 다음 NSDictionary
에 저장합니다.

번호 목록 후/전 공간을 제거 사용자의 요구

에 따라 교체 할 수있는 일 : 모든 공간

$>Dict: { 
    C =  (
     "5 6 7 8 9 1 2 3", 
     "5 6 7 8 9 1 2 3" 
    ); 
    M =  (
     "2 2", 
     "1 2" 
    ); 
} 

또는 제거 :

NSString *numbers = [[str substringWithRange:[result rangeAtIndex:2]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

제공

NSString *numbers = [[str substringWithRange:[result rangeAtIndex:2]] stringByReplacingOccurrencesOfString:@" " withString:@""]; 

다음 중 어느 것을 제공합니까 :

$>Dict: { 
    C =  (
     56789123, 
     56789123 
    ); 
    M =  (
     22, 
     12 
    ); 
} 
+0

이 정보로 질문을 편집하십시오. 그 이유는 명확하지 않기 때문입니다. 결과는 사전이 될 수 없습니다. Dict는 순서가없고 중복 키를 가질 수 없습니다. – Larme

+0

RE는 부동 소수점 값을 캡처 할 수 있도록 @@ ([A-Z]) ([\ [0-9] [.] \\ s] *) "'로 약간 작업해야했습니다. 임시 사전을 만들어 각 사전을 배열에 삽입했습니다. 의견을 보내 주셔서 감사합니다. 그 지금 일하고있어. –

관련 문제