从字符串中获取特定值并创建数组

时间:2018-03-05 20:13:48

标签: ios arrays swift substring

从某个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")
    }
}

提前致谢

1 个答案:

答案 0 :(得分:0)

我会使用正则表达式来处理与已知格式的字符串中提取数据相关的任何内容。为此,首先定义辅助函数:

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]))
}