考虑到2个(或更多)整数可以在一起并且应该被视为单个整数,如何从单个字符串中获取字母和整数?

问题描述 投票:0回答:1

考虑到 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 个字符串,这使得我合并两个数组的逻辑崩溃。

  1. 有没有更好的方法来获得预期的输出之一?或
  2. 如何解决
    components(separatedBy:
    为相同类型的字符串提供不同输出的问题?
arrays swift string integer
1个回答
0
投票

使用正则表达式,这可以在一行中完成。

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)
© www.soinside.com 2019 - 2024. All rights reserved.