从某个URL我创建了一个字符串数组,我想从这些字符串中获取一些数据并将它们转换为另一个变量数组。
我的字符串数组看起来像这样:
#EXTINF:-1 tvg-logo="https://www.thetvdb.com/banners/posters/248741-9.jpg" group-title="Broke Girls", trailer
#EXTINF:-1 tvg-logo="https://www.thetvdb.com/banners/posters/210841-10.jpg" group-title="Alphas", Alphas trailer
#EXTINF:-1 tvg-logo="https://www.thetvdb.com/banners/posters/309053-2.jpg" group-title="American Gothic", trailer
每一行代表我的数组中的一个新字符串项。
我正在尝试创建一个函数来实现它,但直到现在,我只有这个:
func grabValuesFromUrl(savedUrl: String) {
var trailersArray = []()
if let url = URL(string: savedUrl) {
do {
let contents = try String(contentsOf: url)
contents.enumerateLines { (line, stop) in
// here i need to grab the values from every string inside tvg-logo="", group-title="", and the last one after "," that's the title, and put them into trailersArray[], afterwards i will make some model class to get the data like trailersArray.logo and trailersArray.group and trailersArray.title
}
} else {
print("no url added")
}
}
提前致谢
我将使用正则表达式来处理与已知格式的字符串中提取数据相关的任何内容。为此,让我们首先定义辅助函数:
func matches(for regex: String, inText text: String) -> [String] {
guard let regex = try? NSRegularExpression(pattern: regex, options: [.caseInsensitive]) else { return [] }
let nsString = text as NSString
let results = regex.matches(in: text, options: [], range: NSMakeRange(0, nsString.length))
return results.flatMap { result in
(0..<result.numberOfRanges).map {
result.range(at: $0).location != NSNotFound ? nsString.substring(with: result.range(at: $0)) : ""
}
}
}
然后定义将提取所需数据的正则表达式:
let regex = "^.*tvg-logo=\"(.+)\".*group-title=\"(.+)\".*, (.+)$"
请注意,此正则表达式对数据格式敏感,因此如果发生更改,您必须将其调整为新的正则表达式。
最后,在行枚举闭包中,您可以提取数据:
let parts = matches(for: regex, inText: line).dropFirst()
parts
现在是一个包含三个相应项的数组(我们删除第一个,因为它是行本身),如果该行与正则表达式匹配,那么我们可以,例如,向数组附加一个带有值的元组:
if parts.count == 3 {
trailersArray.append((logo: parts[0], group: parts[1], title: parts[2]))
}