【问题标题】:How to use this regex with NSRegularExpression?如何将此正则表达式与 NSRegularExpression 一起使用?
【发布时间】:2016-04-21 01:16:22
【问题描述】:

我正在尝试使用来自this answer 的正则表达式从 URL 中提取 youtube 视频 ID。但是我不知道如何正确格式化它以使用 NSRegularExpression。我尝试转义 C 的反斜杠,以及使用escapedTemplateForStringescapedPatternForString。我还尝试在开始/结束括号之前添加反斜杠。对于我尝试的所有 URL,每种情况都会返回 NSNotFound。

// 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)];

这些是我测试过的网址:

 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"];

【问题讨论】:

    标签: objective-c regex nsregularexpression


    【解决方案1】:

    您需要删除前导和尾随斜杠。问题是,您正在从 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2022-01-14
      • 2015-12-18
      • 2016-12-29
      • 2011-06-19
      相关资源
      最近更新 更多