NSPredicate 匹配除数字之外的任何内容

Posted

技术标签:

【中文标题】NSPredicate 匹配除数字之外的任何内容【英文标题】:NSPredicate MATCHES anything but numbers 【发布时间】:2012-03-08 15:05:25 【问题描述】:

我有一个数据数组,我想从中提取仅包含数字和数字的行。行示例:

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 对象。

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

谢谢。

【问题讨论】:

【参考方案1】:

您的正则表达式匹配除单个数字之外的任何内容。如果要匹配仅包含数字和数字的行,则需要一个 匹配包含非数字的行的正则表达式。

您可以使用以下正则表达式:^[0-9]+$。它连续匹配一个或多个 (+) 数字 ([0-9]),没有别的(锚点 ^$ 确保这一点)。

然后,不是过滤不匹配的行,而是只处理匹配的行:

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

【讨论】:

非常感谢。那时我可能误解了正则表达式验证器的输出。你能告诉我在数字之前 (^[0-9]) 与在数字内部 ([^0-9]) 之间有 ^ 的区别吗? ^ 作为 整个 正则表达式的第一个字符和 $ 作为最后一个字符被称为锚点:regular-expressions.info/anchors.html^ 作为 字符类 中的第一个字符是另一回事,它否定类:[a] 匹配单个字符 a,而 [^a] 匹配除 a 之外的任何字符: regular-expressions.info/charclass.html【参考方案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 ...

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

【讨论】:

也感谢您的回答,@sch。我发现在这种特殊情况下,只使用 NSPredicate 会更容易。你能告诉我 NSRegularExpression 和 NSPredicate 的优缺点吗? nsregex 在处理更复杂的正则表达式时是否更好?

以上是关于NSPredicate 匹配除数字之外的任何内容的主要内容,如果未能解决你的问题,请参考以下文章

需要一个正则表达式来删除除数字之外的所有内容

NSPredicate 返回除给定对象之外的所有对象

正则表达式,匹配除 \r \n 之外的所有内容作为普通字符

使用 < 和 > 对代码进行编码时,正则表达式匹配除 HTML 标记之外的任何内容

RegEx 用于匹配除逗号分隔的数字之外的所有字符

用于定位回车换行符的正则表达式后跟除 8 位数字和 | 之外的任何内容