文字列「Hello World」がある場合、パターン @"World" で NSRegularExpression を使用して一致の位置を取得することは可能ですか。つまり、「Hello World」の例では、一致の位置/インデックスは「6」でなければなりません"?
PHPでは、これを達成するために「PREG_OFFSET_CAPTURE」フラグを指定してpreg_matchを使用しますが、objective-cはこれをサポートしていますか?
文字列「Hello World」がある場合、パターン @"World" で NSRegularExpression を使用して一致の位置を取得することは可能ですか。つまり、「Hello World」の例では、一致の位置/インデックスは「6」でなければなりません"?
PHPでは、これを達成するために「PREG_OFFSET_CAPTURE」フラグを指定してpreg_matchを使用しますが、objective-cはこれをサポートしていますか?
ココアの方法でそれを行うことができます:
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の方法(これは、1つの一致のみが必要であり、この関数/メソッドは一致範囲を直接返すため、便利な場合があります):
#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: を使用してこれを行うこともできます。