如果我有字符串“Hello World”,是否可以使用带有模式@“World”的 NSRegularExpression 来获取匹配的位置,即在“Hello World”示例中,匹配的位置/索引应该是“6 “?
在 php 中,我会使用preg_match和“PREG_OFFSET_CAPTURE”标志来实现这一点,objective-c 是否支持这一点?
如果我有字符串“Hello World”,是否可以使用带有模式@“World”的 NSRegularExpression 来获取匹配的位置,即在“Hello World”示例中,匹配的位置/索引应该是“6 “?
在 php 中,我会使用preg_match和“PREG_OFFSET_CAPTURE”标志来实现这一点,objective-c 是否支持这一点?
你可以用 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(®ex_obj, regex_str, REG_EXTENDED);
if (error)
{
return NSMakeRange(NSNotFound, 0);
}
match_str = [string UTF8String];
error = regexec(®ex_obj, match_str, 1, &match, 0);
if (error)
{
return NSMakeRange(NSNotFound, 0);
}
regfree(®ex_obj);
return NSMakeRange(match.rm_so, match.rm_eo - match.rm_so);
}
这在 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
。
如果您要大量使用 RegEx,我建议您查看RegexKit 或 RegexKitLite。
是的,有可能。您可以使用 NSRegularExpression 方法 rangeOfFirstMatchInString:options:range: 返回第一个匹配项的范围。如果您不需要使用 REGEX,您也可以使用 NSString 方法 rangeOfString: 来执行此操作。