swift - Swift - 正则表达式与组件/连接:这对字符串操作更有效
问题描述
我需要删除 Swift 中单词之间的过多空格(给定字符串中不会超过 5 个单词),不确定哪个更有效:正则表达式或普通组件并加入?
例如:
Hello world! My name is Tom.
结果:
Hello world! My name is Tom.
方法一:
let result = input.components(separatedBy: " ").filter { string -> Bool in
return string.isEmpty == false
}.joined(separator: " ")
方法二:
let result = input.replacingOccurrences(of: "[ \t]+", with: " ", options: .regularExpression, range: range)
解决方案
我运行了一些性能测试,将罗密欧与朱丽叶的整个脚本逐行提供给这两个函数(参见在线示例)。
实际上,我有点惊讶正则表达式替换几乎与组件/字符串操作相当:正则表达式只是慢了 ~2 倍:
| Approach | abs. running time | cpu time | Time to evaluate func | memory peak |
|-------------------|-------------------|----------|-----------------------|-------------|
| components/string | 0.21 sec | 0.2 sec | 0.11 sec | 9 Mb |
| regex replace | 0.33 sec | 0.36 sec | 0.21 sec | 34 Mb |
这并不意味着什么。可能唯一明显的区别是峰值内存消耗。但是,即使您在合理数量的并行循环中运行正则表达式替换,它也应该没问题。尽管如此,始终使用您的真实代码运行您自己的测试。
然而,底线正如rmaddy所评论的那样
使用您喜欢的代码并发现更易于阅读和维护。
推荐阅读
- excel - 在没有 Exit Sub 的情况下无法进入下一个
- python - 为什么在 django 中测试视图时会出现 404?
- excel - 比较不同工作表中的值(VBA/公式)
- model-view-controller - 如何使用 MVC 包装器将 TreeList 绑定到 MVC 模型类
- java - 网络文档的数字签名
- vue.js - v-for loop only array correspond to the dynamic page number
- neo4j - Neo4j var-length 路径搜索慢
- python - python 测试用例要模拟什么?
- javascript - 如何 Ctrl+A 页面并将其输入到字符串中
- c - 如何在模拟 24 小时之前或模拟 24 小时内停止执行的模拟程序