正则表达式逐行提取文本

时间:2015-09-15 07:05:51

标签: ios objective-c regex nsregularexpression

是否可以逐行进行正则表达式检查?所以,如果我的文字为:

#EXTINF:-1 tvg-name="seedocs" tvg-logo="RT",RT
#http://odna.octoshape.net/f3f5m2v4/cds/ch5_320p/chunklist.m3u8
#http://odna.octoshape.net/f3f5m2v4/cds/ch5_720p/chunklist.m3u8
http://rt.ashttp14.visionip.tv/live/rt-global-live-HD/playlist.m3u8

#EXTINF:-1 tvg-name="hsn" tvg-logo="hsn",HSN TV
rtsp://hsn.mpl.miisolutions.net:1935/hsn-live01/_definst_/mp4:420p500kB31

我想删除所有文本:#http:....

所以我使用了以下代码:

获取匹配数据:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"((#EXTINF.*\r\n)(.*))+(http|https)://((\\w)*|([0-9]*)|([-|_])*\r\n)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+" options:NSRegularExpressionCaseInsensitive error:&error];

从#http ...开始删除文字:

 NSRegularExpression *regexName = [NSRegularExpression regularExpressionWithPattern:@"#.*$" options:NSRegularExpressionCaseInsensitive error:&error];

这将在日志中提供如下输出:

#EXTINF:-1 tvg-name="seedocs" tvg-logo="RT",RT

这意味着,我无法检索到的值:

http://rt.ashttp14.visionip.tv/live/rt-global-live-HD/playlist.m3u8

我的输出应该是这样的:

#EXTINF:-1 tvg-name="seedocs" tvg-logo="RT",RT
http://rt.ashttp14.visionip.tv/live/rt-global-live-HD/playlist.m3u8

请有人帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

可以构建匹配多行的RE,但这样做对您和RE引擎都是一个挑战。你通常最好匹配单行;例如,你可以匹配以#http开头的行,包括行终止符,并用任何内容替换每个这样的匹配。

但是,如果您正在进行逐行处理,那么使用componentsSeparatedByString:首先将输入分解为行,然后处理每一行(比如删除以{{1开头的那些行)可能会更好(使用#http)。

HTH

答案 1 :(得分:0)

签出以下代码来执行此操作:我想删除所有文本:#http:....

NSMutableString *finalString = string.mutableCopy;

[string enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {

    if ([line hasPrefix:@"#http"]) {
        [finalString replaceOccurrencesOfString:line withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, finalString.length)];
    }
}];