2012-03-08 73 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

相关问题