何时使用正则表达式而不是内置的字符串方法?

11
我注意到有很多小辩论关于何时使用正则表达式和何时使用内置的字符串函数,比如String.Replace()(.NET)。
看起来很多人推荐在处理字符串时(除了仅显示它们之外),总是、总是、总是使用正则表达式。这是最佳实践还是我个人的错误印象?当问题仅是“从此文本中删除任何这些单词的出现”时,使用正则表达式似乎有点过头了。
我想得到一些意见,以便改进自己的代码并更好地回答其他人关于字符串操作的问题(这样的问题有很多)。

1
这个问题大约一周之前曾被问过:http://stackoverflow.com/questions/1038186/are-there-particular-cases-where-native-text-manipulation-is-more-desirable-than/ - instanceof me
@streetpc:感谢你提供链接。我肯定之前看到过,只是找不到了。 - Tomalak
6个回答

13

我认为,当可以使用基于字符串的搜索/替换时,将Regex作为一种全能解决方案是错误的印象。

Regex本质上是一种模式匹配过程,应该在要匹配的字符串类型变量或仅符合特定模式时使用。对于只需要简单字符串搜索的情况,我总是建议使用String类的内置方法。

我从未看到任何性能统计表明基于Regex的查找比字符串索引更快或更高效。此外,Regex引擎在其执行能力上也有所不同。

如果这还不够,那么构造一个表现非常糟糕的Regex(例如使用大量回溯)就相当容易,因此如果您真的想使用Regex匹配来优化性能,则需要深入了解Regex。另一方面,即使对于新手来说,执行基于字符串的搜索或替换也很简单。


这也是我想的。似乎对于每个基于字符串的答案,都有5个正则表达式的答案。 - colithium
1
你的意思是在StackOverflow上吗?这可能是因为人们倾向于只问非显而易见的字符串相关问题并自行解决其余部分。非显而易见类型的问题通常需要使用正则表达式解决方案。不过,这不应被视为两种方法的一般性利弊的代表。 :-) - Cerebrus

3

Regex.Replace()比String.Replace()方法更加耗费资源。在可能的情况下,请使用String.Replace(),而在必要时使用Regex。

查看这个基准测试以查看时间差异。


2
我非常喜欢正则表达式,但如果有一个简单的xxx->replace("foo","bar")类型的函数可用,那么使用像正则表达式这样的强大工具似乎是愚蠢的,因为一个简单的螺丝刀就可以完成。
如果性能是一个问题,那么对于简单的替换,正则表达式可能会消耗很多CPU。(在复杂的搜索/转换中,正则表达式通常比一系列“更简单”的调用更有效率)。
此外,我经常被“次要”的实现差异所困扰——比如Python的match()内置函数上隐含的"^...$"。当时我在路上没有网络访问,最终不得不买另一本Lutz的书来找出问题所在!

电动工具很有趣,直到你用钉枪把手钉在墙上。 - Matthew Scharley

1

显然,对于复杂的搜索/匹配/替换操作,正则表达式是最好的选择。对于简单的替换一个单词为另一个单词的操作,通常使用普通字符串方法。

但在许多情况下,情况并不那么简单。有时候你会遇到一种情况,你可以使用标准字符串操作,而正则表达式解决方案更加优雅。即使香草字符串算法快10倍,也总是一个好主意问问自己,在那个特定的代码片段中是否重要(例如,如果代码没有在循环中执行)。

我更喜欢简单正则表达式操作的可读性,而不是使用纯字符串操作的更复杂但更快的算法。

这只是我的两分钱...


0

当你想要替换子字符串时,内置的字符串替换方法比正则表达式更快。

以下是在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 更好。但是,如果您必须匹配未知的字符串或模式,则正则表达式可能更好。


0

我认为,如果字符串类有专门的函数来操作你想要的方式,那么它应该非常接近“好”,而正则表达式是通用的。

但是像任何主观事物一样,如果你关心性能时间,就要选择不同的方法。

另一方面,做最容易理解的事情,并进行性能监测,以找到真正的瓶颈。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接