arrays - 从包含某些(双)字符的字符串创建字符串数组
问题描述
我有一串单词和数学/编程使用的符号。例如,像这样:
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: ["+", "+", "=="]
任何帮助深表感谢
解决方案
您需要的是将您的符号作为常规字符串进行威胁。迭代每个符号并在您的源中搜索它。如果您发现一个范围将其附加到集合中,请获取该位置的子字符串,然后从范围 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)
这将打印
["+", "+", "=="]
推荐阅读
- python - 适用于 Python 3x 的 Windows 7“选择默认程序”
- ios - iOS 上的全屏 web 视图
- mysql - Spring JPA 等价于 MySql 行构造函数
- mysql - 从已找到的查询中排除日期
- r - R actionButton与底部对齐
- ios - 加载 html 时 WKWebView 崩溃包含带有“捕获”属性的标签
- java - 想要使用 Java 从 Android 中的另一个活动中清除 SharedPreferences
- c# - 如何在 azure 函数中读取文件(在发布请求中)?
- asp.net-core - 在 vs 2017 构建服务器中构建失败的 asp.net core 5.0
- php - 将pdf方向向右更改(RTL)| rialto-php - 木偶师