如何在Objective-C中检查字符串是否与正则表达式匹配?

34
自从Cocoa不支持正则表达式后,我发现RegexKitLite非常有用。但是所有的示例都提取匹配的字符串。
我只想测试一个字符串是否与正则表达式匹配,并获得一个“是”或“否”的答案。
我该怎么做?

2
正则表达式在Cocoa中不受支持?自iOS 4.0发布以来,NSRegularExpression一直是框架的一部分,比这个问题提出的时间早了近一年。显然,在NSRegularExpression推出之前就已经有使用正则表达式的方法,例如Vaz的回答中所提到的。 - Mark Amery
4个回答

59
我已经使用NSPredicate来达到这个目的:
NSString *someRegexp = ...; 
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", someRegexp]; 

if ([myTest evaluateWithObject: testString]){
//Matches
}

谢谢,我可以使用默认正则表达式语法来匹配某个表达式吗? - DarkLeafyGreen
2
我认为是的,例如,我用它来进行简单的电子邮件验证:NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}"; - Vladimir
3
@Vladimir,那个电子邮件正则表达式不够完善。电子邮件地址可能包含Unicode字符,并且顶级域名长度不是2到4个字符。 - Winny
3
它满足了我的需求,用户也没有任何抱怨 :) 但是你可以很容易地用更好的替换它,因为它并不是这个问题的一部分。 - Vladimir

27

另一种比使用NSPredicate稍微简单的方法是使用NSString的-rangeOfString:options:方法,这是一个几乎没有记录的选项:

NSRange range = [string rangeOfString:@"^\\w+$" options:NSRegularExpressionSearch];
BOOL matches = range.location != NSNotFound;

我说“几乎没有文档”,是因为该方法本身不将该选项列为可用选项,但如果您偶然发现搜索和比较运算符的文档,并找到NSRegularExpressionSearch,则会发现自OS X 10.7和iOS 3.2以来,它是-rangeOfString...方法的有效选项。


2
使用-isMatchedByRegex:方法。
if([someString isMatchedByRegex:@"^[0-9a-fA-F]+:"] == YES) { NSLog(@"Matched!\n"); }

6
请注意,这不是可可的一部分。这里有一个非常简单的答案...https://dev59.com/jG855IYBdhLWcg3wbjnO。 - Fattie
嗯,@Vladimir的答案对我来说似乎更简单。 - meaning-matters
2
"== YES" 是多余的。 - chubao
使用这个库来执行Cocoa中包含的非常简单的操作并不是一个好主意。 - Kevin Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接