【问题标题】:Copy part of a string to another string将字符串的一部分复制到另一个字符串
【发布时间】:2017-11-02 10:47:17
【问题描述】:

我必须解析这些类型的字符串:

let result1 = "t=20171017T1201&s=349.00&fn=8712000100030779&i=21456&fp=124519970&n=1"
let result2 = "t=20171016T180757&s=92.00&fn=8710000101140572&i=17711&fp=4191934636&n=1"

我需要以某种方式提取tfn 参数并将它们保存到另一个字符串:

print(t1)    // 20171017T1201
print(fn1)   // 8712000100030779
print(t2)    // 20171016T180757
print(fn2)   // 8710000101140572

我设法通过逐个符号检查整个字符串来获取这些参数,但必须有更好的方法。

【问题讨论】:

标签: ios swift


【解决方案1】:

您需要使用components(separatedBy: _) 将字符串拆分为可解析的对。

let result1 = "t=20171017T1201&s=349.00&fn=8712000100030779&i=21456&fp=124519970&n=1"
let result2 = "t=20171016T180757&s=92.00&fn=8710000101140572&i=17711&fp=4191934636&n=1"

func value(for name: String, in query: String) -> String? {
    for params in query.components(separatedBy: "&") {
        let pair = params.components(separatedBy: "=")
        if (pair.first == name) { 
            return pair.last
        }
    }
    return nil
}

print(value(for: "t", in: result1))
print(value(for: "fn", in: result1))
print(value(for: "t", in: result2))
print(value(for: "fn", in: result2))

【讨论】:

    【解决方案2】:

    基于这些字符串基本上是 URL 的查询参数这一事实,您可以使用以下 hack 很容易地获取它:

    let result1 = "t=20171017T1201&s=349.00&fn=8712000100030779&i=21456&fp=124519970&n=1"
    let result2 = "t=20171016T180757&s=92.00&fn=8710000101140572&i=17711&fp=4191934636&n=1"
    
    let params1 = queryParameters(from: result1)
    let params2 = queryParameters(from: result2)
    
    if let t1 = params1["t"], let t2 = params2["t"] {
        print(">>> t1 - \(t1) t2 - \(t2)")
    }
    
    
    public func queryParameters(from parameters: String) -> [String: String] {
        var components = URLComponents()
        components.query = parameters
        guard
            let queryItems = components.queryItems else {
                return [:]
        }
    
        var parameters = [String: String]()
        for item in queryItems {
            parameters[item.name] = item.value
        }
    
        return parameters
    }
    

    【讨论】:

    【解决方案3】:

    它会在这里创建一个小解决方法,URLComponents 在这种情况下可以为您提供帮助,因为您的输入对我来说似乎是一个标准查询字符串(请参阅RFC-3986)。

    let result1: String = "t=20171017T1201&s=349.00&fn=8712000100030779&i=21456&fp=124519970&n=1"
    

    所以我会利用这一点,并期望使用 URLQueryItem 的数组,所以这个扩展被放置在一个数组上(可能无效但非常简单)。

    extension Array where Iterator.Element == URLQueryItem {
    
        subscript(key: String) -> String? {
            get {
                return self.filter { $0.name == key }.first?.value
            }
        }
    
    }
    

    然后我会以任意随机顺序从随机生成但语法有效的 URL 中读取组件:

    if let url = URL(string: "u://?\(result1)"),
        let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) {
    
        // ...
    
        let t: String? = urlComponents.queryItems?["t"] // "20171017T1201"
        let s: String? = urlComponents.queryItems?["s"] // "349.00"
        let fp: String? = urlComponents.queryItems?["fp"] // "124519970"
        let random: String? = urlComponents.queryItems?["random"] // nil
    
        // ...
    }
    

    注意:这个方案是根据你输入的字符串(query-string)的性质,如果以后输入格式发生变化,你可能需要直接使用正则表达式来提取信息。

    【讨论】:

      【解决方案4】:

      你可以像这样实现它:

      if let t1 = result1.components(separatedBy: "t=")[1].components(separatedBy: "&").first {
          print(t1) // 20171017T1201
      }
      
      if let fn1 = result1.components(separatedBy: "fn=")[1].components(separatedBy: "&").first {
          print(fn1) // 8712000100030779
      }
      

      注意,如果您非常确定您的字符串是 URL 参数,我建议您关注@Milan Nosáľ answer

      【讨论】:

        猜你喜欢
        • 2015-02-05
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 2021-08-28
        • 2017-01-11
        • 2012-05-09
        • 1970-01-01
        相关资源
        最近更新 更多