2012-03-17 3 views
0

나는 PHP의 strtr과 비슷한 문자 치환을 수행하기 위해 노력하고있는 NSString 범주가 있습니다. 이 메서드는 문자열을 사용하고 fromString에있는 각 문자의 모든 항목을 바꿔서 toString의 문자로 바꾸고 동일한 인덱스를 사용합니다. 필자는 작동 방법이 있지만 성능이 좋지 않으며 메가 바이트 단위의 데이터를보다 신속하게 처리 할 수 ​​있기를 원합니다. (선명도)Objective-C NSString 문자 대체

편집 :

stringByReplacingOccurrencesOfString:withString:options:range:이 작동하지 않습니다. 나는 "ABC"와 같은 문자열을 가져야하고 "A"를 "B"로, "B"를 "A"로 "BAC"로 대체해야합니다. stringByReplacingOccurrencesOfString:withString:options:range:의 연속 호출은 올바르지 않은 "AAC"와 같은 문자열을 만듭니다.

제안 사항은 좋지만 샘플 코드가 더 좋을 것입니다.

코드 :

- (NSString *)stringBySubstitutingCharactersFromString:(NSString *)fromString 
               toString:(NSString *)toString; 
{ 
    NSMutableString *substitutedString = [self mutableCopy]; 
    NSString *aCharacterString; 

    NSUInteger characterIndex 
    ,   stringLength = substitutedString.length; 

    for (NSUInteger i = 0; i < stringLength; ++i) { 
     aCharacterString = [NSString stringWithFormat: @"%C", [substitutedString characterAtIndex:i]]; 
     characterIndex = [fromString rangeOfString:aCharacterString].location; 

     if (characterIndex == NSNotFound) continue; 

     [substitutedString replaceCharactersInRange:NSMakeRange(i, 1) 
            withString:[NSString stringWithFormat:@"%C", [toString characterAtIndex:characterIndex]]]; 
    } 

    return substitutedString; 
} 

는 또한이 코드는 텍스트 뷰의 텍스트에 대한 모든 변경 후에 실행됩니다. 매번 문자열 전체가 전달됩니다. 나는 그것을 할 수있는 더 좋은 방법이 있다는 것을 알고 있지만 어떻게 해야할지 모르겠습니다. 이것에 대한 어떤 제안이라도 대단히 감사 할 것입니다!

답변

0

NSRegularExpression으로 문자열 대체를 만들 수 있습니다. 변경 가능한 문자열을 수정하거나 새로운 불변 ​​문자열을 만듭니다. (두 개 이상의 심볼이더라도) 두 개의 문자열로 대체 할 수 있지만 정규 표현식 (예 : \ [ (. * ? + 등)을 의미하는 문자를 이스케이프 처리해야합니다.

패턴은 두 개 이상의 하위 문자열 중 하나 인 "와 (과) 사이에 임의의 문자가 있음"을 발견하면 그 두 문자열을 사이에 선택적 문자열을 유지하면서 두 하위 문자열로 바꿉니다.

// These string can be of any length 
NSString *firstString = @"Axa"; 
NSString *secondString = @"By"; 
// Escaping of characters used in regular expressions has NOT been done here  
NSString *pattern = [NSString stringWithFormat:@"(%@|%@)(.*?)(%@|%@)", firstString, secondString, firstString, secondString]; 

NSString *string = @"AxaByCAxaCBy"; 

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern 
                     options:NSRegularExpressionCaseInsensitive 
                     error:&error]; 
if (error) { 
    // Insert error handling here... 
} 

NSString *modifiedString = [regex stringByReplacingMatchesInString:string 
                  options:0 
                  range:NSMakeRange(0, [string length]) 
                 withTemplate:@"$3$2$1"]; 


NSLog(@"Before:\t%@", string);   // AxaByCAxaCBy 
NSLog(@"After: \t%@", modifiedString); // ByAxaCByCAxa 
+0

매우 유망 해 보인다. 문자 단위로 바꾸기 위해 조작 할 수 있는지 보겠습니다. – TheCrypticAce

+0

문자별로 문자를 교체하지 않아도되도록 노력했습니다. 도움이된다면, 한 캐릭터는 여러 캐릭터가 아닌 오직 하나의 캐릭터로 대체됩니다. – TheCrypticAce

+0

'fromString'을'firstString','toString'을'secondString'으로하고'modifiedString'을 돌려 줄 수 없습니까? 당신의 방법은 여전히 ​​질문에서와 같이 보입니다. –