首页 > 解决方案 > 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)

标签: swiftregexstring

解决方案


我运行了一些性能测试,将罗密欧与朱丽叶的整个脚本逐行提供给这两个函数(参见在线示例)。

实际上,我有点惊讶正则表达式替换几乎与组件/字符串操作相当:正则表达式只是慢了 ~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所评论的那样

使用您喜欢的代码并发现更易于阅读和维护。


推荐阅读