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
// ...
}