使用 Swift 3.0 将包含“字符串数组”的字符串解析为数组 [重复]
Posted
技术标签:
【中文标题】使用 Swift 3.0 将包含“字符串数组”的字符串解析为数组 [重复]【英文标题】:Parse String containing "Array of String" into Array using Swift 3.0 [duplicate] 【发布时间】:2017-08-16 05:10:05 【问题描述】:我正在寻找一种使用 Swift 3.0 将此字符串转换为数组的方法
let arrayString: String = "[\"One\", \"Two\", \"Three\", \"Four\"]"
// Should be converted into:
let array: [String] = [
"One",
"Two",
"Three",
"Four"
]
如果我使用,
作为分隔符将它分成令牌,它将包括[
和]
,所以它不起作用。如何正确转换?
注意:
问题不同于: Simple and clean way to convert JSON string to Object in Swift
我没有尝试转换其中包含多个键的 JSON 对象。
【问题讨论】:
此处与 Swift 2 解决方案相同的问题:Swift Convert A String-As-An-Array, To An Array Of Strings 【参考方案1】:它是一个 JSON 字符串,您必须使用 JSONSerialization 将其转换为普通字符串数组。
Swift 3.0
func convertToArray(str: String) -> [String]?
let data = str.data(using: .utf8)
do
return try JSONSerialization.jsonObject(with: data!, options: []) as? [String]
catch
print(error.localizedDescription)
return nil
let aString: String = "[\"One\", \"Two\", \"Three\", \"Four\"]"
let arrayString = convertToArray(str: aString)
print(arrayString) // ["One", "Two", "Three", "Four"]
【讨论】:
我不得不说,非常聪明:),但是你应该避免可选的包装,而是使用可选的绑定, 我认为更好的方法是使用try?
而不是try
,然后使用as? [String]
链接它以获取可选数组。
@EdwardAnthony 通过我对 Ujesh 的回复进行的编辑,您拥有了您想要的、映射和验证。我希望这可以帮助你。对于未来,请尝试在您的问题上更加一致,以便能够更好地帮助您:)
感谢 Ujesh 和 Victor Sigler,这真的很有帮助!
向 UTF-8 的转换不能失败。【参考方案2】:
有很多方法可以实现你想要的,但我认为最简单的方法之一是:
let newArray = arrayString
.replacingOccurrences(of: "[", with: "")
.replacingOccurrences(of: "]", with: "")
.replacingOccurrences(of: "\"", with: "")
.components(separatedBy: ",")
输出应该是:
["One", " Two", " Three", " Four"]
编辑:
正如@MartinR 建议的那样,如果任何字符串包含逗号或方括号,则先前的答案将不起作用。因此,要解决此问题,您可以删除方括号,假设在开头和结尾当然总是存在,然后使用正则表达式匹配 \"()\"
中的所有内容,如下面的代码:
让我们使用以下函数来匹配正则表达式:
func matches(for regex: String, in text: String) -> [String]
do
let regex = try NSRegularExpression(pattern: regex)
let nsString = text as NSString
let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
return results.map nsString.substring(with: $0.range)
catch let error
print("invalid regex: \(error.localizedDescription)")
return []
更多参考可以看@MartinR 回答here
有了这个函数,我们可以使用下面的代码来实现我们想要的:
let str = "[\"One[\",\"T,w,o,\",\"Thr,ee,,,\",\"Fo,ur,,,\"]"
// remove the square brackets from the array
let start = str.index(str.startIndex, offsetBy: 1)
let end = str.index(str.endIndex, offsetBy: -1)
let range = start..<end
let newString = str.substring(with: range)
// match the regex
let matched = matches(for: "(?<=\")(.*?)(?=\")", in: newString) // ["One[", ",", "T,w,o,", ",", "Thr,ee,,,", ",", "Fo,ur,,,"]
但之前的 matched
包含数组中的 ","
,所以让我们使用以下代码修复它:
let stringArray = matched.enumerated()
.filter $0.offset % 2 == 0
.map $0.element
输出如下:
["One[", "T,w,o,", "Thr,ee,,,", "Fo,ur,,,"]
希望对你有帮助。
【讨论】:
它可以工作,但我们无法检查该值是否类似于数组,例如如果用户输入[[[1,]
或其他没有数组格式的字符串,它不会返回可选价值。
是的,你是对的,但你的问题不是关于那个,不是吗?我的回答解决了你的问题,你从来没有说过什么。同样是一大堆解决方法,因为您可以使用正则表达式来验证输入,然后对其进行映射。
这很脆弱。如果任何字符串包含逗号或方括号,它将无法正常工作。
@MartinR 你完全正确,感谢您的观察【参考方案3】:
这是转换成数组的自定义代码:
var arrayString: String = "[\"One\", \"Two\", \"Three\", \"Four\"]"
arrayString = arrayString.replacingOccurrences(of: "[", with: "")
arrayString = arrayString.replacingOccurrences(of: "]", with: "")
arrayString = arrayString.replacingOccurrences(of: " ", with: "")
arrayString = arrayString.replacingOccurrences(of: "\"", with: "")
print("\(arrayString)")
var arr: [Any] = arrayString.components(separatedBy: ",")
print("\(arr)")
如果您从 API 及其 JSON 获得上述字符串,请使用以下内容:
extension String
func toJSON(): Any?
guard let data = self.data(using: .utf8, allowLossyConversion: false) else return nil
return try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)
【讨论】:
以上是关于使用 Swift 3.0 将包含“字符串数组”的字符串解析为数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Substring with Concatenation of All Words, 返回字符串中包含字符串数组所有字符串元素连接而成的字串的位置