首页 > 解决方案 > 从包含某些(双)字符的字符串创建字符串数组

问题描述

我有一串单词和数学/编程使用的符号。例如,像这样:

let source = "a + b + 3 == c"

(注意:不能依赖空格)

我还有一个字符串数组,我需要从源字符串中过滤掉:

let symbols = ["+", "-", "==", "!="]

现在,我需要创建一个匹配项的数组带有重复项)。在这种情况下,将是["+", "+", "=="]

根据我的尝试,==是两个字符,所以我不能执行以下操作:

let source = "a + b + 3 == c"
let symbols = CharacterSet(charactersIn: "+-=≠") // not '==' and '!=', but '=' and '≠' due to it being a CharacterSet

let operations = source
    .map { String($0) }
    .filter { char in symbols.contains(UnicodeScalar(char)!) }

print(operations)
// Output: ["+", "+", "=", "="]
// Needed: ["+", "+", "=="]

任何帮助深表感谢

标签: arraysswiftstring

解决方案


您需要的是将您的符号作为常规字符串进行威胁。迭代每个符号并在您的源中搜索它。如果您发现一个范围将其附加到集合中,请获取该位置的子字符串,然后从范围 upperBound 之后的索引中再次搜索您的字符串。当您到达搜索该符号的字符串末尾时,请从源中删除子字符串。尝试这样的事情:

var source = "a + b + 3 == c"
let symbols = ["+", "-", "==", "!="]

var results: [Substring] = []

for symbol in symbols {
    var startIndex = source.startIndex
    var ranges: [Range<String.Index>] = []
    while startIndex < source.endIndex,
          let range = source[startIndex...].range(of: symbol) {
        ranges.append(range)
        results.append(source[range])
        startIndex = source.index(after: range.upperBound)
    }
    for range in ranges.reversed() {
        source.removeSubrange(range)
    }
}

print(results)  

这将打印

["+", "+", "=="]


推荐阅读