什么时候我应该更喜欢内置字符串函数的正则表达式?

时间:2011-06-08 15:32:55

标签: regex perl

有人说我应该尽可能使用正则表达式,其他人说我应该尽可能使用它。关于那个问题或仅仅是TIMTOWTDI,是否有类似“Perl Etiquette”的东西?

7 个答案:

答案 0 :(得分:10)

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

  • 是否没有内置的字符串函数可以相对轻松地处理它?<​​/ li>
  • 我是否需要捕获子串组?
  • 我是否需要复杂的功能,如后视或负片?
  • 我会使用字符集吗?
  • 使用正则表达式会使我的代码更具可读性吗?

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

答案 1 :(得分:8)

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

总结:如果有可用的健壮的解析器,请使用它而不是正则表达式; 100%的时间。不要向新手推荐别的东西。所以 -

注意事项

待办事项

  • 请在适当的地方使用substrindexrindex,但要认识到它们可以“不正常”脱落,因此当基准测试显示它们优于正则表达式时,最好使用它们;在许多情况下,正则表达式可以惊人地快。
  • 当没有好的解析器可用时使用正则表达式并且编写Parse::RecDescent语法是过度的,太多的工作,或者会太慢。
  • 对于众所周知/可预测的数据(包括之前禁止使用正则表达式的HTML / CSV),请使用正则表达式作为单行代码等丢弃代码。
  • 请注意P :: RecD,Parse::YappMarpa等更大问题的替代方案。
  • 请保留自己的理事会。 Perl应该很有趣。做你喜欢的事;如果你在没有遵循建议的情况下抱怨并且横向走动,那就准备好了。 :P

答案 2 :(得分:4)

我不知道有关于此的任何“礼仪”。

Perl正则表达式是高度优化的(这是该语言已知的事情之一,尽管有更快的引擎),最后,如果你的正则表达式如此简单以至于它可以被字符串函数替换,我不相信正则表达式的性能会明显降低。如果您要解决的问题是时间敏感的,那么您可能会考虑其他优化可能性。

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

只是我的两分钱。

答案 3 :(得分:4)

虽然我会将其归类为opinionated,但我会提出自己的观点。

当字符串为:

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

使用正则表达式:

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

答案 4 :(得分:3)

我会说,如果您需要多于一个或两个字符串函数调用,请使用正则表达式。 ;)

答案 5 :(得分:2)

Perl是正则表达式的绝佳语言。老实说,它拥有任何语言最强大的解析器之一,所以这就是为什么你看到这么多“使用正则表达式”的答案。然而,我不确定对正则表达式的厌恶是什么。

我的回答是:你能比单独使用字符串函数更简单地总结单个模式中的工作,还是需要使用多个字符串函数而不是单个正则表达式?在任何一种情况下,我都会瞄准正则表达式。否则,做适合你的事。

答案 6 :(得分:2)

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

并且也不是太简单的问题,因为再次使用正则表达式是重量级的,并且通常有内置函数来处理简单的场景。

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