2014-09-01 28 views
0

工作,我需要檢查閹我的字符串這個正則表達式匹配:\+?\d{0,3} (這種模式已經在這裏測試:http://regexpal.com,似乎沒事)正則表達式模式不會在Objective-C

這是我做的:

NSString * proposedNewString = @"+3";  
NSString * pattern = @"\\+?\\d{0,3}"; 
NSError * err = nil; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&err]; 
if (err) { 
    NSLog(@"Couldn't create regex with given string and options"); 
    return NO; 
} 

NSPredicate * myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES '%@'", regex]; 

NSLog(@"proposed str = %@", proposedNewString); 
if ([myTest evaluateWithObject:proposedNewString]) { 
    NSLog(@"yes"); 
} 
else { 
    NSLog(@"no"); 
} 

我希望它打印出來yes,但由於某種原因它打印no。也許我搞亂了反斜槓或引號。我究竟做錯了什麼?

回答

1

的「匹配」運營商在謂詞格式要求爲參數一個模式字符串, 不是正則表達式(和你不能用引號括起來%@)。 那麼這將產生預期的結果「是」:

NSString * proposedNewString = @"+3";  
NSString * pattern = @"\\+?\\d{0,3}"; 
NSPredicate * myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern]; 
if ([myTest evaluateWithObject:proposedNewString]) { 
    NSLog(@"yes"); 
} else { 
    NSLog(@"no"); 
} 

或者,使用的NSRegularExpression方法,而不是一個謂詞之一,例如

if ([regex numberOfMatchesInString:proposedNewString options:0 range:NSMakeRange(0, [proposedNewString length])] > 0) { 
    NSLog(@"yes"); 
} else { 
    NSLog(@"no"); 
} 
+0

時,我只是沒有附上'%@'我的應用程序崩潰消息'2014-09-01 19:48:30.518 MyApp [6686:60b]建議str = + 3' '2014-09-01 19:48:30.520 MyApp [6686:60b] ***終止應用到期未捕獲異常「NSInvalidArgumentException」,原因:'不能從對象 \ +?\ d {0,3} 0x1.''創建一個正則表達式表達式,但是除了'evaluateWit hObject:'你的'numberOfMathcesInString:options:range'似乎是工作。非常感謝你的幫助。 – 2014-09-01 17:00:49

+1

@MikhailZinkovsky:請再看看我的答案的第一部分。對於'predicateWithFormat',你必須傳遞* pattern字符串*'pattern',而不是正則表達式'regex'。我測試了這個代碼,它對我很有用。 – 2014-09-01 17:03:09

+0

是的,你是完全正確的,這是我愚蠢的失敗。萬分感謝。 – 2014-09-01 17:16:52