2011-07-06 62 views
0

在UITextView中,用戶可以輸入格式爲{{1}}{{177}}的數字。在預覽字段中,非常類似於此,我想用NSArray中的值替換該模式,其中數字對應於數組中的行。用NSArray中的對象替換NSString中的數字

我有兩個想法來解決這個問題:

  1. 計數所有出現的NSRegularExpression,遍歷它們並替換它們。
  2. 從NSString中創建一個字數組並循環遍歷數組,取代出現的位置並將NSString重新放在一起。

這兩個選項中的哪一個更具性能和可靠性?有另一種方法嗎?

- update - 這是找到模式的正則表達式:@"\\{\\{([1-9]|[1-9][0-9]|[1-9][0-9][0-9])\\}\\}"。我如何在循環中用一個整數來替換這個模式?

+0

輸入字符串的格式是什麼?你可以使用[NSString componentsSeparatedByString:]? – thelaws

回答

2

下面是一個使用NSRegularExpression的答案:

NSString * input = @"{{83}} fjsdkfjds {{122}}"; 

NSMutableString * strToMakeReplacements = [[NSMutableString alloc] initWithString:input]; 

NSError * error = nil; 
NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"\\{\\{([1-9]|[1-9][0-9]|[1-9][0-9][0-9])\\}\\}" options:NSRegularExpressionCaseInsensitive error:&error]; 

NSArray * matches = [regex matchesInString:input options:NSMatchingReportProgress range:NSMakeRange(0, [input length])]; 

for (int i = [matches count]-1; i>=0 ; i--) { 
    NSTextCheckingResult * match = [matches objectAtIndex:i]; 

    NSRange matchRange = match.range; 
    NSString * numString = [input substringWithRange:NSMakeRange(matchRange.location+2, matchRange.length-4)]; 
    NSInteger num = [numString intValue]; 

    NSString * replacementValue = [self replacementValueForNum:num]; // write this function yourself 

    [strToMakeReplacements replaceCharactersInRange:match.range withString:replacementValue]; 
} 

請注意,您需要升級PE斜線在你的正則表達式,使之成爲\\{\\{([1-9]|[1-9][0-9]|[1-9][0-9][0-9])\\}\\}

+0

+1從背後取代不是一個壞主意。 –

+0

工程太棒了!謝謝 – Patrick

1

我會使用第二種方法,因爲它似乎比使用正則表達式更方便(雖然我承認對他們不是很有經驗)。

給定的輸入字符串NSString* input我會過濾掉非數字字符如下:

NSCharacterSet* notNumbersSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 
NSArray * wholeNumbers = [input componentsSeparatedByCharactersInSet:notNumbersSet]; 

現在遍歷整數數組:

for(NSString* numString in wholeNumbers) { 
    NSInteger num = [numString intValue]; 
    // ... 
} 
+0

該方法很好。但它不僅是數字,而且是括號{{}}的特定模式。這將如何工作? – Patrick

+0

哦,我誤解了。然後是的,你需要一個正則表達式來匹配你的模式。你需要查看NSRegularExpression文檔頁面。 – thelaws

1

一個NSRegularExpression辦法是這樣的 -

NSRegularExpression * expression = [NSRegularExpression regularExpressionWithPattern:@"\\{\\{(\\d+?)\\}\\}" 
                      options:0 
                       error:nil]; 
NSMutableString * resultString = [aString mutableCopy]; 
NSTextCheckingResult * result; 
NSUInteger location = 0; 

/* Get the first match in the remaining string to search */ 
while ((result = [expression firstMatchInString:resultString options:0 range:NSMakeRange(location, [resultString length] - location)])) { 

    /* Get the index of the array using the capture group 1 i.e. (\\d+?) */ 
    NSUInteger index = [[resultString substringWithRange:[result rangeAtIndex:1]] integerValue]; 

    /* Get the string that will replace the match */ 
    NSString * replacementString = [replacementStrings objectAtIndex:index]; 

    /* Replace the string */ 
    [resultString replaceCharactersInRange:result.range withString:replacementString]; 

    /* Skip to the end of the replaced string */ 
    location = result.range.location + [replacementString length]; 
} 

由於我們替換字符串來自數組我懷疑我們有一個單獨的語句解決這個。在這裏,我們找到了一個匹配,然後適當地替換它,然後搜索字符串的其餘部分進行匹配。我們重複這一點,沒有更多的結果。