2013-01-17 43 views
1

我正在製作一個iOS計算器應用程序。我想能夠在字符串找到一個數字字符和一個括號的右邊出現彼此相鄰,如這些例子:NSString檢測數字,然後括號

  • 23(8 + 9)
  • (89+ 2)(78)
  • (7 + 8)9

我想能夠將這些occurances之間插入字符:

  • 23(8 + 9)。將23 *(8 + 9)
  • (89 + 2)(78)。將(89 + 2)*(78)
  • (7 + 8)9將(7 + 8)* 9
+0

你的第一個例子不改變表達式的含義嗎? –

+0

看起來像是適合DDMathParser的任務。 – 2013-01-17 22:02:10

+0

@CarlNorum哎呀!固定! – Undo

回答

2

這裏有一個快速功能我熟了,它使用正則表達式來找到你的matchi ng模式,然後在需要的地方插入「*」。它匹配兩個括號「)(例如」或一個數字和括號「5(」或「)3」,如果它們之間存在空格,例如「)5」,它也會起作用。

隨意調整功能,以適應您的需求。不知道這是否是最好的方式,但它是有效的。

有關正則表達式的更多信息,請參閱documentation for NSRegularExpression

- (NSString *)stringByInsertingMultiplicationSymbolInString:(NSString *)equation { 
    // Create a mutable copy so we can manipulate it 
    NSMutableString *mutableEquation = [equation mutableCopy]; 

    // The regexp pattern matches: 
    // ")(" or "n(" or ")n" (where n is a number). 
    // It also matches if there's whitepace in between (eg. (4+5) (2+3) will work) 
    NSString *pattern = @"(\\)\\s*?\\()|(\\d\\s*?\\()|(\\)\\s*?\\d)"; 

    NSError *error; 
    NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error]; 
    NSArray *matches = [regexp matchesInString:equation options:NSMatchingReportProgress range:NSMakeRange(0, [equation length])]; 

    // Keep a counter so that we can offset the index as we go 
    NSUInteger count = 0; 
    for (NSTextCheckingResult *match in matches) { 
     [mutableEquation insertString:@"*" atIndex:match.range.location+1+count]; 
     count++; 
    } 

    return mutableEquation; 
} 

這是我測試過它:

NSString *result; 

result = [self stringByInsertingMultiplicationSymbolInString:@"23(8+9)"]; 
NSLog(@"Result: %@", result); 

result = [self stringByInsertingMultiplicationSymbolInString:@"(89+2)(78)"]; 
NSLog(@"Result: %@", result); 

result = [self stringByInsertingMultiplicationSymbolInString:@"(7+8)9"]; 
NSLog(@"Result: %@", result); 

這將輸出:

Result: 23*(8+9) 
Result: (89+2)*(78) 
Result: (7+8)*9 

注:此代碼使用ARC,所以如果您使用MRC,請記住自動釋放複製的字符串。

+0

哇!驚人!我正在使用DDMathParser,但您標記爲正確! – Undo