看起来很多人推荐在处理字符串时(除了仅显示它们之外),总是、总是、总是使用正则表达式。这是最佳实践还是我个人的错误印象?当问题仅是“从此文本中删除任何这些单词的出现”时,使用正则表达式似乎有点过头了。
我想得到一些意见,以便改进自己的代码并更好地回答其他人关于字符串操作的问题(这样的问题有很多)。
我认为,当可以使用基于字符串的搜索/替换时,将Regex作为一种全能解决方案是错误的印象。
Regex本质上是一种模式匹配过程,应该在要匹配的字符串类型变量或仅符合特定模式时使用。对于只需要简单字符串搜索的情况,我总是建议使用String
类的内置方法。
我从未看到任何性能统计表明基于Regex的查找比字符串索引更快或更高效。此外,Regex引擎在其执行能力上也有所不同。
如果这还不够,那么构造一个表现非常糟糕的Regex(例如使用大量回溯)就相当容易,因此如果您真的想使用Regex匹配来优化性能,则需要深入了解Regex。另一方面,即使对于新手来说,执行基于字符串的搜索或替换也很简单。
Regex.Replace()比String.Replace()方法更加耗费资源。在可能的情况下,请使用String.Replace(),而在必要时使用Regex。
查看这个基准测试以查看时间差异。
显然,对于复杂的搜索/匹配/替换操作,正则表达式是最好的选择。对于简单的替换一个单词为另一个单词的操作,通常使用普通字符串方法。
但在许多情况下,情况并不那么简单。有时候你会遇到一种情况,你可以使用标准字符串操作,而正则表达式解决方案更加优雅。即使香草字符串算法快10倍,也总是一个好主意问问自己,在那个特定的代码片段中是否重要(例如,如果代码没有在循环中执行)。
我更喜欢简单正则表达式操作的可读性,而不是使用纯字符串操作的更复杂但更快的算法。
这只是我的两分钱...
当你想要替换子字符串时,内置的字符串替换方法比正则表达式更快。
以下是在Golang中进行的基准测试数据,我尝试替换了3种类型的子字符串。
基准测试 Replace 2 --- 236 ns/op
基准测试 Replace 5 --- 249 ns/op
基准测试 Replace 10 --- 871 ns/op
基准测试 Regexp 2 --- 3750 ns/op
基准测试 Regexp 5 --- 4457 ns/op
基准测试 Regexp 10 --- 6020 ns/op
如您所见,如果您要替换已知的子字符串,则 Replace 比 Regexp 更好。但是,如果您必须匹配未知的字符串或模式,则正则表达式可能更好。
我认为,如果字符串类有专门的函数来操作你想要的方式,那么它应该非常接近“好”,而正则表达式是通用的。
但是像任何主观事物一样,如果你关心性能时间,就要选择不同的方法。
另一方面,做最容易理解的事情,并进行性能监测,以找到真正的瓶颈。