【问题标题】:nspredicate using NSregularexpressionnspredicate 使用 NSregular 表达式
【发布时间】:2014-09-29 08:14:45
【问题描述】:

我正在使用以下正则表达式来匹配字符串中的整个单词

(?:[a-b][A-B][0-9])*test(?:[a-b][A-B][0-9])* //ig

我已经在http://regex101.com/ 上测试了这个正则表达式,它使用以下示例数据按预期工作。

示例字符串:

these are words !@#$hello@#$$$ abc@123.com z,kakdk test test.sample@56789.com 8x11-1dc pages 123  123 TeSt test_2000

我需要使用这个正则表达式来过滤使用谓词匹配正则表达式的字符串数组。我正在使用下面的代码来做到这一点,但我总是得到零输出。

NSString *string = [NSString stringWithFormat:@"(?:[a-b][A-B][0-9])*%@(?:[a-b][A-B][0-9])*",searchTerm];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name MATCHES[c] %@",string];

用下面的代码验证了我的正则表达式,它工作正常:

NSString *someRegexp = @"(?:[a-b][A-B][0-9])*test(?:[a-b][A-B][0-9])*";
NSString *testString = @"these are words !@#$hello@#$$$ abc@123.com z,kakdk test_2000 test.sample@56789.com 8x11-1dc pages 123  123 TeSt";
NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:someRegexp options:NSRegularExpressionCaseInsensitive error:nil];
NSUInteger regExMatches = [regEx numberOfMatchesInString:testString options:0 range:NSMakeRange(0, [testString length])];

请帮帮我。非常感谢您的帮助。提前致谢

【问题讨论】:

  • 请正确格式化您的帖子,使代码块可读。
  • 我在下面添加了一个答案,但如果我误解了问题,或者您需要从字符串中提取特定的单词/短语,请发表评论,我很乐意看看。跨度>

标签: objective-c regex nspredicate nsregularexpression


【解决方案1】:

我整理了一个使用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:&regexError];

        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 的属性,我们可以将它与NSStringsubstringWithRange: 方法结合使用来提取匹配的单词。在这里,我们只是简单地记录单词。

以你的测试字符串为例,输出如下:

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

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多