在objective-c中,可以在字符串中获得正则表达式匹配的位置

时间:2012-05-20 04:49:51

标签: objective-c regex position offset nsregularexpression

如果我有字符串“Hello World”,是否可以使用NSRegularExpression和模式@“World”来获取匹配的位置,即在“Hello World”示例中匹配的位置/索引应该是“6”?

在php中我会使用带有“PREG_OFFSET_CAPTURE”标志的preg_match来实现这一点,Objective-c是否支持这个?

4 个答案:

答案 0 :(得分:3)

你可以用Cocoa方式做到:

NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"world" options:0 error:NULL];
// omitted error checking for the sake of simplicity
NSString *str = @"Hello world!";
[regex enumerateMatchesInString:str
    options:0
    range:NSMakeRange(0, str.length)
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
    {
        NSLog(@"Match at [%d, %d]", result.range.location, result.range.length);
    }];
[regex release];

或POSIX方式(这可能对您来说很方便,因为您只想要一个匹配,并且此函数/方法直接返回匹配范围):

#include <regex.h>

- (NSRange)matchString:(NSString *)string toRegex:(NSString *)regex
{
    regex_t regex_obj;
    regmatch_t match;
    const char *regex_str;
    const char *match_str;
    int error;

    regex_str = [regex UTF8String];
    error = regcomp(&regex_obj, regex_str, REG_EXTENDED);
    if (error)
    {
        return NSMakeRange(NSNotFound, 0);
    }

    match_str = [string UTF8String];
    error = regexec(&regex_obj, match_str, 1, &match, 0);
    if (error)
    {
        return NSMakeRange(NSNotFound, 0);
    }

    regfree(&regex_obj);
    return NSMakeRange(match.rm_so, match.rm_eo - match.rm_so);
}

答案 1 :(得分:1)

这在Cocoa中有点长,但你可以这样做:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression
    regularExpressionWithPattern:@"world"
    options:NSRegularExpressionSearch
    error:&error];
NSString *str = @"Hello, world!";
NSTextCheckingResult *match = [regex firstMatchInString:str
    options:0
    range:NSMakeRange(0, [str length])];
if (match) {
    NSRange matchRange = [match range];
    NSLog(@"%lu", matchRange.location);
}

这会打印7

答案 2 :(得分:1)

如果您打算大量使用RegEx,我建议您查看RegexKit or RegexKitLite.

答案 3 :(得分:0)

是的,这是可能的。您可以使用NSRegularExpression方法,rangeOfFirstMatchInString:options:range:返回第一个匹配的范围。您也可以使用NSString方法rangeOfString执行此操作:如果您不需要使用REGEX。