如何将此正则表达式与 NSRegularExpression 一起使用?
How to use this regex with NSRegularExpression?
我正在尝试使用 this answer 中的正则表达式从 URL 中提取 YouTube 视频 ID。但是我不知道如何正确格式化它以使用 NSRegularExpression。我试过转义 C 的反斜杠,以及使用 escapedTemplateForString
和 escapedPatternForString
。我还尝试在 opening/closing 括号前添加反斜杠。每个案例 returns NSNotFound 为所有 URL 我尝试。
// Original: /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/
NSString *c_escaped = @"/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/";
NSString *template = [NSRegularExpression escapedTemplateForString:c_escaped]; // "/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/"
NSString *pattern = [NSRegularExpression escapedPatternForString:c_escaped]; // "\/\^\.\*\(youtu\.be\\/\|v\\/\|e\\/\|u\\/\w\+\\/\|embed\\/\|v=\)\(\[\^#\&\\?]\*\)\.\*\/"
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:c_escaped
options:0
error:&error];
NSRange range = [expr rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
NSRegularExpression *expr1 = [NSRegularExpression regularExpressionWithPattern:template
options:0
error:&error];
NSRange range1 = [expr1 rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
NSRegularExpression *expr2 = [NSRegularExpression regularExpressionWithPattern:pattern
options:0
error:&error];
NSRange range2 = [expr2 rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
这些是我测试过的URL:
NSArray *urls = @[
@"//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0",
@"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
@"http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel",
@"http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub",
@"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I",
@"http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY",
@"http://youtu.be/6dwqZw0j_jY",
@"http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be",
@"http://youtu.be/afa-5HQHiAs",
@"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0",
@"http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel",
@"http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub",
@"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I",
@"http://www.youtube.com/embed/nas1rJpm7wY?rel=0",
@"http://www.youtube.com/watch?v=peFZbP64dsU",
@"http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player",
@"http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player",
@"http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player"];
您需要删除开头和结尾的斜杠。问题是,您正在从 JavaScript 改编它,它允许使用“/”来分隔字符串。您还需要转义反斜杠以使 Obj-C 编译器做正确的事情,仅此而已。试试这个:
@implementation NSString (youtube)
- (BOOL)isYouTubeURL
{
NSString *youtubePattern = @"^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*";
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:youtubePattern
options:0
error:nil];
NSRange range = [expr rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
return range.location != NSNotFound;
}
@end
我正在尝试使用 this answer 中的正则表达式从 URL 中提取 YouTube 视频 ID。但是我不知道如何正确格式化它以使用 NSRegularExpression。我试过转义 C 的反斜杠,以及使用 escapedTemplateForString
和 escapedPatternForString
。我还尝试在 opening/closing 括号前添加反斜杠。每个案例 returns NSNotFound 为所有 URL 我尝试。
// Original: /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/
NSString *c_escaped = @"/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/";
NSString *template = [NSRegularExpression escapedTemplateForString:c_escaped]; // "/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/"
NSString *pattern = [NSRegularExpression escapedPatternForString:c_escaped]; // "\/\^\.\*\(youtu\.be\\/\|v\\/\|e\\/\|u\\/\w\+\\/\|embed\\/\|v=\)\(\[\^#\&\\?]\*\)\.\*\/"
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:c_escaped
options:0
error:&error];
NSRange range = [expr rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
NSRegularExpression *expr1 = [NSRegularExpression regularExpressionWithPattern:template
options:0
error:&error];
NSRange range1 = [expr1 rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
NSRegularExpression *expr2 = [NSRegularExpression regularExpressionWithPattern:pattern
options:0
error:&error];
NSRange range2 = [expr2 rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
这些是我测试过的URL:
NSArray *urls = @[
@"//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0",
@"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
@"http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel",
@"http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub",
@"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I",
@"http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY",
@"http://youtu.be/6dwqZw0j_jY",
@"http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be",
@"http://youtu.be/afa-5HQHiAs",
@"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0",
@"http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel",
@"http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub",
@"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I",
@"http://www.youtube.com/embed/nas1rJpm7wY?rel=0",
@"http://www.youtube.com/watch?v=peFZbP64dsU",
@"http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player",
@"http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player",
@"http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player",
@"http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player"];
您需要删除开头和结尾的斜杠。问题是,您正在从 JavaScript 改编它,它允许使用“/”来分隔字符串。您还需要转义反斜杠以使 Obj-C 编译器做正确的事情,仅此而已。试试这个:
@implementation NSString (youtube)
- (BOOL)isYouTubeURL
{
NSString *youtubePattern = @"^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*";
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:youtubePattern
options:0
error:nil];
NSRange range = [expr rangeOfFirstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
return range.location != NSNotFound;
}
@end