代码之家  ›  专栏  ›  技术社区  ›  RobertPitt

“正则表达式”与“字符串比较运算符/函数”

  •  6
  • RobertPitt  · 技术社区  · 14 年前

    这个问题是围绕PHP中的性能而设计的,但是如果您愿意的话,可以将它扩展到任何语言。

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

    我完全理解一些操作必须用正则表达式完成,直到复杂为止,但是对于可以通过regex和字符串函数解析的操作。

    举个例子:

    PHP

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

    C.*

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

    可以很容易地完成

    PHP

    ctype_alpha('thisisallalpha');
    

    C.*

    VFPToolkit.Strings.IsAlpha('thisisallalpha');
    

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

    你应该尝试和倾向于什么版本的字符串比较,为什么?

    5 回复  |  直到 14 年前
        1
  •  6
  •   Community CDub    8 年前

    看来这个问题是从我们小小的争论中产生的 here 所以我觉得自己有责任做出回应。

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

    但是,对于可读性,regexp显然很难读取, 使用它们的代码 在大多数情况下,都是更短、更干净、更简单(在上面的链接中比较您和我的答案)。

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

    所以,正则表达式不是更慢、更可读和更灵活的。我们到底为什么要避开他们?

        2
  •  1
  •   mario    14 年前

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

    这里还有另一种观点来概括:PCRE处理条件的速度比Zend内核处理if字节码的速度要快。

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

        3
  •  1
  •   Daniel Vandersluis    14 年前

    当匹配很简单时,PHP本身建议使用字符串函数而不是regex函数。例如,从 preg_match 手册页:

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

    或者来自 str_replace 手册页:

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

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

    我个人的立场是使用字符串函数进行匹配 静止的 字符串(即匹配始终相同的不同字符序列的匹配)和其他所有内容的正则表达式。

        4
  •  0
  •   Spudley Pat    14 年前

    同意PHP人员倾向于过分强调一个函数的性能而不是另一个函数。这并不意味着性能差异不存在——它们确实存在——但大多数PHP代码(实际上大多数代码)都有 许多的 比选择regex而不是字符串比较更糟的瓶颈。要找出瓶颈所在,请使用xdebug的分析器。在担心对单个代码行进行微调之前,先解决它遇到的问题。

        5
  •  0
  •   Mark Thomas    14 年前

    他们都是语言的一部分,这是有原因的。伊莎帕更具表现力。例如,当您看到的表达式本身是alpha或不是alpha,并且具有域含义时,请使用它。

    但是,如果它是一个输入验证,并且可能被更改为包含下划线、破折号等,或者如果它与其他需要regex的逻辑一起使用,那么我将使用regex。对我来说,这往往是大多数时间。

    推荐文章