2012-03-08 75 views
1

我有一個數據數組,我想從中提取只包含數字和數字的行。對行的例子:NSPredicate匹配除數字以外的任何內容

15 2, '',7,9,21

(在 '' 代表一個或多個空格)。

在這種情況下,我想僅提取15,7和9我使用謂詞以下列方式:

NSString *pattern = @"[^0-9]"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern]; 
if (![predicate evaluateWithObject:myStringToMatch]) 
// Extract ... 

我已經測試使用在線正則表達式測試儀我的圖案,並發現[^ 0-9]除了數字0-9外其他都不匹配。但是,當我運行上面的代碼時,它只匹配空格而不是例如+2,我很確定它應該這樣做。只是爲了澄清,myStringToMatch是一個NSString對象。

我不知道爲什麼它不符合我的模式。任何人都可以給我提示我做錯了什麼?

謝謝。

回答

5

你的正則表達式匹配除了一個數字之外的任何東西。如果您要匹配僅包含數字和數字的行,則需要一個正則表達式,它將在包含非數字的行上匹配而不是

您可以使用以下正則表達式:^[0-9]+$。它匹配一個或多個(+)數字([0-9])連續和沒有別的(錨點^$確保)。

然後,而不是不匹配的過濾行,你只處理那些行:

if ([predicate evaluateWithObject:myStringToMatch]) 
// note the absence of negation operator 
// Extract ... 
+0

非常感謝。那麼我可能誤解了正則表達式驗證器的輸出。你能告訴我之前(^ [0-9])數字與內部([^ 0-9])之間的差異嗎? – 2012-03-09 07:11:30

+1

'^'作爲第一個和'$'作爲* whole * regex的最後一個字符被稱爲錨:http://www.regular-expressions.info/anchors.html。 '*'作爲*字符類中的第一個字符是另一回事,它否定了類:'[a]'匹配單個字符'a',而'[^ a]'匹配除'a'之外的任何字符: http://www.regular-expressions.info/charclass.html – 2012-03-09 10:20:45

+0

再次感謝。這清除了。 – 2012-03-09 11:36:53

2

不,您的正則表達式匹配除單個之外的任何數字。

您可以使用下面的代碼來測試是否一個字符串只包含數字:

NSRegularExpression *r = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:0 error:nil]; 

NSArray *result = [r matchesInString:s options:0 range:NSMakeRange(0, s.length)]; 

結果將是空的字符串:+2「」和+21和非空爲以下字符串: 15,7和9

所以,你的代碼可以改成:

if ([r matchesInString:s options:0 range:NSMakeRange(0, s.length)].length) { 
    // Extract ... 
} 

此外,您還可以使用相同的正則表達式與謂詞如果您想。

+0

感謝您的回答爲好,@sch。我發現在這種特殊情況下使用NSPredicate會更容易。你能告訴我NSRegularExpression vs NSPredicate的優點/缺點嗎?在處理更多的完整正則表達式時,nsregex更好嗎? – 2012-03-09 07:17:23

相關問題