何时使用Regex vs内置字符串方法?

时间:2009-06-30 09:02:09

标签: regex string

我注意到很多关于何时使用正则表达式以及何时使用像String.Replace()(.NET)这样的内置字符串函数的争论。

似乎很多人总是建议总是在处理字符串时总是使用正则表达式(除了显示它们之外)。这是真正的最佳做法还是我的错误印象?当问题只是“从这个文本中删除任何这些单词的任何出现”时,使用正则表达式似乎有点过分了。

我想要输入,这样我就可以改进自己的代码并更好地回答其他人关于字符串操作的问题(其中有很多)。

6 个答案:

答案 0 :(得分:9)

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

Regex本质上是一个模式匹配的过程,当你想要匹配的字符串类型是可变的或只符合特定的模式时,应该使用它。对于简单的字符串搜索就足够的情况,我总是建议使用String类的内置方法。

我从未见过任何性能统计数据表明基于正则表达式的查找比字符串索引更快或更高效。此外,Regex引擎的执行能力也各不相同。

好像这还不够,构建一个性能非常差的Regex(例如使用大量的回溯)非常容易,因此如果你真的想要使用正则表达式匹配来优化性能,那么就需要深入了解Regex。另一方面,即使n00b执行基于字符串的搜索或替换,它也非常简单。

答案 1 :(得分:2)

Regex.Replace()比String.Replace()方法贵得多。尽可能使用String.Replace(),并在必要时使用Regex。

请查看此benchmark以查看时差。

答案 2 :(得分:2)

我只是喜欢正则表达式但是如果有一个简单的xxx->替换(“foo”,“bar”)类型函数可用,当使用简单的螺丝刀时,使用像正则表达式这样的电动工具似乎很傻。

如果性能是一个问题,那么正则表达式对于简单的替换可能非常麻烦。 (正则表达式通常比复杂的搜索/转换更有效,而不是一系列“更简单”的调用。)

此外,我不断被“次要”实施差异所困扰 - 就像Pythons暗示“^ ... $”在内置的match()上。我当时在路上没有上网,最后又买了另一本Lutz的书来找出发生了什么!

答案 3 :(得分:1)

显然,对于复杂的搜索/匹配/替换操作,正则表达式是可行的方法。对于像用另一个单词替换单个单词这样的简单内容,首选普通字符串方法。

但在许多情况下,并非那么简单。有时您会遇到可以使用标准字符串操作的情况,而正则表达式解决方案更优雅。即使vanilla字符串算法的速度提高了10倍,最好还是自问一下这段特定的代码是否重要(例如,如果代码没有在循环中执行)。

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

只是我的2美分......

答案 4 :(得分:0)

我倾向于认为,如果有一个专门的函数来按照你想要的方式操作一个字符串作为字符串类的一部分,那么它应该非常接近'good',因为正则表达式是通用的。

但与任何主观一样,如果你关注表演时间的不同方法。

然后再做最容易理解的事情,并进行性能监控以找到真正的瓶颈。

答案 5 :(得分:0)

当您要替换子字符串时,内置字符串替换方法比正则表达式更快。 这是Golang中的基准数字,我尝试替换3个类型的子字符串。

基准替换 2 --- 236 ns / op

基准替换 5 --- 249 ns / op

基准替换 10 --- 871 ns / op

基准 Regexp 2 --- 3750 ns / op

基准 Regexp 5 --- 4457 ns / op

基准 Regexp 10 --- 6020 ns / op

如您所见,如果要替换已知的子字符串,则Replace比Regexp要好得多。 但是,如果必须匹配未知的字符串或模式,则regexp可能会更好。