'正则表达'VS'字符串比较运算符/函数'

时间:2010-09-20 08:51:51

标签: c# php regex comparison string-comparison

此问题是围绕PHP中的性能设计的,但如果您愿意,可以将其扩展为任何语言。

经过多年使用PHP并且不得不比较字符串后,我了解到在性能方面使用字符串比较运算符对正则表达式是有益的。

我完全理解一些操作必须使用正则表达式来完成复杂性,但是对于可以通过正则表达式和字符串函数解决的操作。

举个例子:

PHP

preg_match('/^[a-z]*$/','thisisallalpha');

C#

new Regex("^[a-z]*$").IsMatch('thisisallalpha');

可以轻松完成

PHP

ctype_alpha('thisisallalpha');

C#

VFPToolkit.Strings.IsAlpha('thisisallalpha');

还有很多其他的例子,但你应该明白我想要的。

您应该尝试使用哪种版本的字符串比较以及为什么?

5 个答案:

答案 0 :(得分:6)

看起来这个问题来自我们的小论点here,所以我觉得自己不得不回应。

php开发人员正在积极地洗脑“性能”,在那里出现了许多谣言和神话,包括像“双引号”这样的纯粹愚蠢的东西。 Regexps“慢”是这些神话中的一个,不幸的是手册支持(参见preg_match页面上的臭名昭着的评论)。事实是,在大多数情况下,你不在乎。除非您的代码重复10,000次,否则您甚至不会注意到字符串函数和正则表达式之间的区别。如果您的代码重复10,000次,那么在任何情况下都必须做错,并且您将通过优化逻辑来获得性能,而不是通过删除正则表达式。

至于可读性,正则表达式难以阅读,但使用它们的代码在大多数情况下更短,更简洁(在上面的链接上比较你和我的答案)。 / p>

另一个重要的问题是灵活性,特别是在php中,其字符串库不支持开箱即用的unicode。在您的具体示例中,当您决定将站点迁移到utf8时会发生什么?使用ctype_alpha,你有点不幸,preg_match需要另一种模式,但会继续工作。

因此,正则表达式不是更慢,更可读,更灵活。为什么我们应该避免它们?

答案 1 :(得分:1)

当正则表达式可以取代多个原子串比较时,实际上会导致性能提升(而不是这种微优化在任何方面都是明智的)。所以通常在大约五个strpos()检查时,建议使用正则表达式。更多的可读性。

这是另一个想法:PCRE可以比Zend内核处理IF字节码更快地处理条件。

但并非所有正则表达式都设计相同。如果复杂度太高,正则表达式递归会破坏其性能优势。因此,混合使用正则表达式匹配和常规PHP字符串函数通常是值得重新考虑的。适合工作的正确工具。

答案 2 :(得分:1)

当匹配很简单时,PHP本身建议在正则表达式函数上使用字符串函数。例如,从preg_match手册页:

  

如果您只想检查另一个字符串中是否包含一个字符串,请不要使用preg_match()。使用strpos()或strstr()代替它们会更快。

或者从str_replace手册页:

  

如果您不需要花哨的替换规则(如正则表达式),则应始终使用此函数而不是ereg_replace()或preg_replace()。

但是,我发现人们试图使用字符串函数来解决regex可以更好地解决的问题。例如,在尝试创建一个全字符串匹配器时,我遇到了人们试图使用strpos($string, " $word ")(注意空格),为了“性能”,而不停下来思考空间是如何不是描述单词的唯一方法(考虑完全替换preg_match('/\bword\b/', $string)需要多少字符串函数调用。)

我个人的立场是使用字符串函数来匹配 static 字符串(即匹配总是相同的不同字符序列的匹配)和其他所有字符串的正则表达式。

答案 3 :(得分:0)

出于某种原因,它们都是语言的一部分。 IsAlpha更具表现力。例如,当您正在查看的表达式本质上是alpha或不具有域意义时,请使用它。

但是,如果它是,例如,输入验证,并且可能被更改为包括下划线,短划线等,或者如果它与其他需要正则表达式的逻辑,那么我将使用正则表达式。这对我来说往往是大部分时间。

答案 4 :(得分:0)

同意PHP人员倾向于过分强调一个功能的性能而不是另一个功能。这并不意味着性能差异不存在 - 它们确实存在 - 但是大多数PHP代码(实际上大多数代码)都比更糟糕的瓶颈而不是选择正则表达式而不是字符串 - 比较。要找出瓶颈所在,请使用xdebug的分析器。在担心微调各行代码之前,先修复它出现的问题。

相关问题