Ios 将字符串的一部分复制到另一个字符串

Ios 将字符串的一部分复制到另一个字符串,ios,swift,Ios,Swift,我必须解析这些类型的字符串: 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" 我需要以某种方式提取t和fn参数,并将它

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

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"
我需要以某种方式提取
t
fn
参数,并将它们保存到另一个字符串中:

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

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

您需要使用
组件(separatedBy:ux)
将字符串拆分为可解析的对

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

您可以像这样实现它:

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参数,我建议您遵循@。

基于这些字符串基本上是URL的查询参数,您可以使用以下技巧轻松获得它:

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
}

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


因此,我将利用这一点,并期望使用
URLQueryItem
的数组,因此此扩展已放置在数组上(可能不是有效的,但非常简单)

然后,我将从随机生成但语法有效的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

    // ...
}


注意:此解决方案基于输入字符串(查询字符串)的性质,如果输入格式将来更改,您可能需要直接使用正则表达式来提取信息。

的可能重复。的可能重复。不需要虚拟方案和主机,请进行比较。@MartinR谢谢,我已经更新了代码以反映它
extension Array where Iterator.Element == URLQueryItem {

    subscript(key: String) -> String? {
        get {
            return self.filter { $0.name == key }.first?.value
        }
    }

}
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

    // ...
}