Objective-C的正则表达式解决方案

rjs*_*ing 10 regex cocoa cocoa-touch objective-c

在Objective-C中使用正则表达式的最佳方法是什么?

似乎有一些开源项目提供正则表达式支持,任何人都可以推荐一个吗?

我也看了一下NSPredicate,任何人都可以建议任何正则表达式的例子吗?

背景:我想使用正则表达式主要用于验证,IP,电子邮件地址,内部ID等

Geo*_*lly 13

NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*@.*\..*'"];
BOOL result = [predicate evaluateWithObject:@"mail@domain.com"];
Run Code Online (Sandbox Code Playgroud)

根据Predicate指南:

匹配
根据ICU v3,使用正则表达式比较,左手表达式等于右手表达式(有关详细信息,请参阅ICU用户指南中的正则表达式).

甚至还有一个由Apple编写例子可以在指南中找到.

而不是SELF你也可以使用密钥路径.(也可能还有一些其他的文字.)


rjs*_*ing 8

请阅读全文后过在http://cocoawithlove.com.

在Cocoa中,NSPredicate的工作方式与SQL的"WHERE"子句大致相同.NSPredicate被带到iPhone的主要原因是NSPredicate在核心数据中履行了与"WHERE"子句在SQL中实现相同的角色 - 允许持久存储获取满足特定条件的对象.

// given an NSDictionary created used the above method named "row"...
NSPredicate *johnSmithPredicate =
    [NSPredicate predicateWithFormat:@"firstname = 'John' AND lastname = 'Smith'"];
BOOL rowMatchesPredicate = [johnSmithPredicate evaluateWithObject:row];
Run Code Online (Sandbox Code Playgroud)

验证电子邮件地址

如果NSString与正则表达式匹配,则NSPredicate(NSLikePredicateOperatorType)中的"LIKE"比较运算符通常用作测试的便捷方式.它比具有更多选项和替换功能的完整库更有优势,因为它已经存在于Cocoa中 - 没有库,没有链接,没有麻烦.

你可以做一个简单的测试:

NSPredicate *regExPredicate =
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regularExpressionString];
BOOL myStringMatchesRegEx = [regExPredicate evaluateWithObject:myString];
Run Code Online (Sandbox Code Playgroud)

剩下的唯一问题是:什么是可用于验证NSString是否包含语法上有效的电子邮件地址的正则表达式?

NSString *emailRegEx =
    @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}"
    @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
    @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
    @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
    @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
    @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
    @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
Run Code Online (Sandbox Code Playgroud)


Mar*_*rra 5