考虑到 2 个(或更多)整数可以在一起并且应该被视为单个整数,如何从单个字符串中获取字母和整数?
所以让我们以字符串
"a2bc31d"
作为输入,我希望输出是一个数组 ["a","2","bc","31","d"]
或 ["a","2","b","c","31","d"]
到目前为止我已经尝试过:
let input = "a2bc31d"
let intArr = input.components(separatedBy: CharacterSet.decimalDigits.inverted) // produces ["", "2", "", "31", ""]
var stringArr = input.components(separatedBy: CharacterSet.letters.inverted).filter({ $0 != "" }) // produces ["a", "bc", "d"]
var newArr = intArr
// Then merge both arrays
for (index,string) in intArr.enumerated() {
if string == "" {
newArr[index] = stringArr.first ?? ""
stringArr.removeFirst()
}
}
print(newArr) //prints ["a", "2", "bc", "31", "d"]
问题在于,对输入进行最小程度的更改,例如
"ab2bc31d"
,然后它就会崩溃,因为创建的数组不一样。
stringArr 很好,现在是
["ab","bc","d"]
,但是 intArr 现在是 ["","","2","","31",""]
而不是 ["","2","","31",""]
。所以有时是为一组字母创建 1 个字符串,有时是为每个字母创建 1 个字符串,这使得我合并两个数组的逻辑崩溃。
components(separatedBy:
为相同类型的字符串提供不同输出的问题?使用正则表达式,这可以在一行中完成。
let input = "a2bc31d"
let matches = input.matches(of: /\D+|\d+/).map(\.output)
print(matches)
正则表达式
/\D+|\d+/
匹配非数字序列或数字序列。 matches(of:)
找到所有这样的序列。
结果
matches
是 [Substring]
。如果您愿意,请随意将其转换为 [String]
:
let strings = matches.map(String.init)