我整理了一个使用NSRegularExpression 类的小解决方案。在这种特殊情况下,NSPredicate 不需要匹配任意字符串中的文本。
main.m中的完整程序如下:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *testString = @"these are words !@#$hello@#$$$ abc@123.com z,kakdk test_2000 test.sample@56789.com 8x11-1dc pages 123 123 TeSt";
NSError *regexError = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\w+"
options:NSRegularExpressionCaseInsensitive
error:®exError];
if (regexError) {
// handle error
NSLog(@"%@", regexError.localizedDescription);
}
[regex enumerateMatchesInString:testString
options:0
range:NSMakeRange(0, testString.length)
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSLog(@"%@", [testString substringWithRange:result.range]);
}];
}
return 0;
}
首先,我们将您从问题中提供的测试字符串创建为名为 testString 的局部变量。
接下来,我们有一个名为 regexError 的局部变量,将在创建 NSRegularExpression 实例时用作输出参数。
然后我们使用提供的类方法创建一个NSRegularExpression 实例,并传入regexError 的地址,该地址将在发生错误时设置。
创建正则表达式后,我们检查是否设置了错误,如果是,则适当处理。在这里,我们只记录错误的描述。
值得注意的是\w 是一个匹配字母、数字和下划线的字符类。我们需要用\ 对其进行转义,因为我们将它放在文字NSString 中,而+ 符号表示我们对1 个或更多感兴趣,匹配尽可能大。
由于目标是匹配单词,因此我们枚举文本字符串中的匹配项,其范围等于字符串的长度。
我们提供了一个NSTextCheckingResult 作为该块的参数之一,它有一个名为range 的属性,我们可以将它与NSString 的substringWithRange: 方法结合使用来提取匹配的单词。在这里,我们只是简单地记录单词。
以你的测试字符串为例,输出如下:
2014-08-06 13:39:56.195 NSPredicate-NSRegularExpression[3914:303] these
2014-08-06 13:39:56.197 NSPredicate-NSRegularExpression[3914:303] are
2014-08-06 13:39:56.198 NSPredicate-NSRegularExpression[3914:303] words
2014-08-06 13:39:56.199 NSPredicate-NSRegularExpression[3914:303] hello
2014-08-06 13:39:56.200 NSPredicate-NSRegularExpression[3914:303] abc
2014-08-06 13:39:56.201 NSPredicate-NSRegularExpression[3914:303] 123
2014-08-06 13:39:56.201 NSPredicate-NSRegularExpression[3914:303] com
2014-08-06 13:39:56.202 NSPredicate-NSRegularExpression[3914:303] z
2014-08-06 13:39:56.203 NSPredicate-NSRegularExpression[3914:303] kakdk
2014-08-06 13:39:56.203 NSPredicate-NSRegularExpression[3914:303] test_2000
2014-08-06 13:39:56.204 NSPredicate-NSRegularExpression[3914:303] test
2014-08-06 13:39:56.204 NSPredicate-NSRegularExpression[3914:303] sample
2014-08-06 13:39:56.205 NSPredicate-NSRegularExpression[3914:303] 56789
2014-08-06 13:39:56.205 NSPredicate-NSRegularExpression[3914:303] com
2014-08-06 13:39:56.206 NSPredicate-NSRegularExpression[3914:303] 8x11
2014-08-06 13:39:56.206 NSPredicate-NSRegularExpression[3914:303] 1dc
2014-08-06 13:39:56.207 NSPredicate-NSRegularExpression[3914:303] pages
2014-08-06 13:39:56.207 NSPredicate-NSRegularExpression[3914:303] 123
2014-08-06 13:39:56.208 NSPredicate-NSRegularExpression[3914:303] 123
2014-08-06 13:39:56.208 NSPredicate-NSRegularExpression[3914:303] TeSt