NSPredicate与数字匹配

时间:2012-03-08 15:05:26

标签: ios regex 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对象。

我不知道为什么它与我的模式不符。谁能给我一个关于我做错的提示?

感谢。

2 个答案:

答案 0 :(得分:5)

你的正则表达式只匹配一个数字。如果要匹配仅包含数字和数字的行,则需要一个正则表达式,匹配包含非数字的行。

您可以使用以下正则表达式:^[0-9]+$。它匹配一行中的一个或多个(+)数字([0-9])而没有其他(锚点^$确保)。

然后,不要过滤不匹配的行,而只处理执行以下操作的行:

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

答案 1 :(得分: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 ...
}

此外,如果您愿意,可以对谓词使用相同的正则表达式。