【问题标题】:When should I prefer regex over built-in string functions?什么时候我应该更喜欢正则表达式而不是内置字符串函数?
【发布时间】:2011-09-11 00:04:47
【问题描述】:

有人说我应该尽可能使用正则表达式,其他人说我应该至少尽可能使用它。有没有关于这件事的“Perl 礼仪”或只是 TIMTOWTDI?

【问题讨论】:

  • @Brad:如果我可以否决您的评论,我当然会。就我可能是一个 regexer 大师而言,我讨厌告诉人们照我说的做,而不是照我做的做。正确编写,正则表达式替换了复杂且难以调试的代码的页面和页面。它们可以使代码更快、更易于维护和更清晰——而不是相反(因为如果它们这样做了,你就做错了)。使用/x;使用空格、缩进、分组和 cmets;使用命名捕获;使用较小的碎片;使用语法正则表达式;等等等等等等。
  • @tchrist:该评论并没有被解释为“从不使用正则表达式”,而是我(以迂回的形式)说正则表达式不应该总是 i> 成为第一个解决方案。如果弄错了,我深表歉意。
  • 确实,Perl 程序员比其他语言的程序员更倾向于考虑正则表达式,即使这些语言也提供正则表达式功能。这是一个有点文化的东西。我们在substr($s, 0, 5) = "" 上写$s =~ s/\A.{5}//s,以及无数类似的例子。当人们未能将经过时间考验的结构化编程原则和“小就是更好”的原则应用到他们身上时,他们就会用正则表达式给自己带来麻烦。 Grammatical regexes帮助很大,还有其他工具。

标签: regex perl


【解决方案1】:

我想说,如果您需要不止一两个字符串函数调用来执行此操作,请使用正则表达式。 ;)

【讨论】:

  • (我的回答假设正则表达式是完成这项工作的正确工具,并且不需要适当的解析器。所以它仅适用于字符串函数与正则表达式。)
  • 是的,我知道,我已经对 Brad Christie 说过,我对我的问题的措辞不太满意。我的评论无意冒犯您,如果我冒犯了您,我深表歉意。
【解决方案2】:

Perl 是一种很棒的正则表达式语言。老实说,它拥有任何语言中最伟大的解析器之一,这就是为什么你会看到这么多“使用正则表达式”的答案。但是,我不确定对正则表达式的厌恶是什么。

我的回答是:你能比使用字符串函数更容易地用一个模式总结工作,还是你需要使用多个字符串函数而不是一个正则表达式?无论哪种情况,我都会瞄准正则表达式。否则,做你觉得舒服的事。

【讨论】:

  • 因为我们在谈论正则表达式:s/PERL/Perlperldoc.perl.org/…
  • Imo 你只有在实际使用它们时才能看到正则表达式的简单和优雅。我想这就是所有厌恶的来源。
  • @AlexTheBird:我认为厌恶的另一部分是学习曲线。其他类型的字符串比较等,使用用户已经知道的编码实践。正则表达式是一种新语法。
【解决方案3】:

复杂程度通常决定了我是否使用正则表达式。在决定是否使用正则表达式时,我提出的一些问题是:

  • 没有内置的字符串函数可以相对轻松地处理这个问题吗?
  • 是否需要捕获子字符串组?
  • 我是否需要像后视或负集这样的复杂功能?
  • 我要使用字符集吗?
  • 使用正则表达式会使我的代码更具可读性吗?

如果我对其中任何一个回答是,我通常会使用正则表达式。

【讨论】:

    【解决方案4】:

    我不知道这有什么“礼仪”。

    Perl 正则表达式经过高度优化(这是该语言众所周知的事情之一,尽管有更快的引擎),最后,如果您的正则表达式非常简单,可以用字符串函数替换,我不相信正则表达式的性能会显着降低。如果您尝试解决的问题对时间非常敏感,您可能会考虑其他优化的可能性。

    另一个重要方面是可读性。而且我认为通过正则表达式处理所有字符串转换也增加了这一点,而不是混合和匹配不同的方法。

    只要我的两分钱。

    【讨论】:

      【解决方案5】:

      对于不太复杂的事情,正则表达式变得臃肿,影响代码的可读性并导致性能问题。您可以通过一系列步骤,使用内置函数和其他方式来完成。您可能没有很酷的单行正则表达式,但您的代码将是可读和可维护的。

      也不是太简单的问题,因为正则表达式的重量很重,而且通常有处理简单场景的内置函数。

      这将取决于你要做什么。当然,请不要使用正则表达式进行解析(尤其是 HTML 等)

      【讨论】:

        【解决方案6】:

        虽然我也将其归类为opinionated,但我会给出我的观点。

        当字符串为:时使用正则表达式:

        • “Too Dynamic”(字符串可能有很多变化,使用字符串库会很麻烦。
        • “包含模式”如果字符串有真正的模式(可能像 1 个字符或一组字符一样简单),这就是(我觉得)正则表达式擅长的地方。
        • “太复杂” 如果您发现自己声明一个完整的功能块只是为了完成单个模式可以做的事情,我可以看到使用正则表达式是值得的。 (不过,请参阅下面的“太复杂”)。

        不要不要使用正则表达式:

        • “快速” 考虑一下启动正则表达式库所涉及的开销,而不是直接从字符串中获取信息。
        • “太复杂” 好的代码并不总是很短。如果您开始制作一个巨大的模式来规避几行代码,那很好,但请记住它存在可读性的风险。回到那篇文章并试图再次围绕它进行思考可能不值得仅仅使用简单的方法。

        【讨论】:

        • 我想你的意思是说较短的代码并不总是好的/更好的。 :-)
        • 是的,你是对的,我应该在表述问题时更加具体。但尽管如此,我认为我得到了很多非常有用的答案。
        【解决方案7】:

        我认为你已经得到的很多答案都很好。我想谈谈礼仪部分,因为我认为有一些。

        总结:如果有强大的解析器可用,用它代替正则表达式; 100% 的时间。永远不要向新手推荐其他任何东西。所以——

        注意事项

        做事

        • 请在适当的地方使用substrindexrindex,但要认识到它们可能会“不恰当”地脱落,因此当基准测试显示它们优于正则表达式时,最好使用它们;在许多情况下,正则表达式的速度惊人地快。
        • 当没有可用的良好解析器并且编写 Parse::RecDescent 语法过大、工作量太大或速度太慢时,请使用正则表达式。
        • 请对一次性代码使用正则表达式,例如在已知/可预测数据上使用单行代码,包括以前禁止使用正则表达式的 HTML/CSV。
        • 请注意更大问题的替代方案,例如 P::RecD、Parse::YappMarpa
        • 保持自己的议会。 Perl 应该很有趣。做任何你喜欢的事;如果您在不听从建议的情况下抱怨并且事与愿违,请准备好受到抨击。 :P

        【讨论】:

        • 在我使用index 的所有时间里,我从未听说过rindex!谢谢,我学到了一些新东西。我想我需要再次使用perlfunc,因为我对 Perl 的了解更深了。
        • 感谢您的时间和努力。
        猜你喜欢
        • 2018-02-09
        • 2022-01-08
        • 2011-05-10
        • 2017-12-21
        • 2016-05-20
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        相关资源
        最近更新 更多