何时应该使用正则表达式而不是内置的字符串函数?

11

有人说尽可能经常使用正则表达式,而另一些人则说应该尽量少用。是否存在类似于“Perl礼仪”的东西或只是TIMTOWTDI?


2
有些人在面对问题时,会想:“我知道,我可以使用正则表达式。”现在他们有了两个问题。(参考背景) - Brad Christie
7
如果我可以在你的评论下投反对票,我一定会这么做。就我而言,作为一个正则表达式专家,我不愿意告诉别人应该怎么做,而是要让自己的实际操作说话。如果编写得当,正则表达式可以代替几页难以调试的代码。它们可以使代码更快,更易于维护和更加清晰,而不是反其道而行之(因为如果是这样的话,那就说明出了问题)。使用 /x,使用空格、缩进、分组和注释;使用命名捕获;使用较小的片段;使用语法化的正则表达式等等。 - tchrist
1
@tchrist:这条评论并不是要表达“永远不要使用正则表达式”的意思,相反,我是在(迂回地)说正则表达式不应该总是第一个解决方案。如果我的话有误导之处,请接受我的道歉。 - Brad Christie
4
即使其他编程语言也提供正则表达式功能,但Perl程序员往往更倾向于使用正则表达式进行思考。这有点是文化传统。例如,我们会写$s =~ s/\A.{5}//s而不是 substr($s, 0, 5) = "",还有无数类似的例子。当人们没有将结构化编程和小即是美的经典原则应用到正则表达式时,他们通常会为正则表达式自找麻烦。语法化的正则表达式可以极大地帮助人们,此外还有其他工具。 - tchrist
7个回答

10

一般来说,我使用正则表达式的取决于复杂度水平。在决定是否使用正则表达式时,我会问自己以下几个问题:

  • 是否有内置字符串函数可以相对容易地处理这个问题?
  • 是否需要捕获子字符串组?
  • 是否需要使用复杂功能,如向后查找或负集合?
  • 是否要使用字符集?
  • 使用正则表达式是否会使我的代码更易读?

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


8
我是一名有帮助的助手,可以为您翻译以下内容:

我认为你已经得到了很多好的答案。我想谈一下礼仪问题,因为我认为这很重要。

总结起来:如果有一个强大的解析器可用,100% 的时间都应该使用它而不是正则表达式。永远不要向新手推荐其他任何东西。所以——

禁忌

建议

  • 适当时使用substr, index, and rindex,但要认识到它们可能不太规范,因此最好在基准测试表明它们优于正则表达式的情况下使用;在许多情况下,正则表达式也可以非常快。
  • 当没有好的解析器可用且编写Parse::RecDescent语法过于繁琐、工作量过大或速度太慢时,请使用正则表达式。
  • 对于像HTML/CSV这样以前禁止使用正则表达式的众所周知/可预测数据的一行代码,请使用正则表达式。
  • 请注意更大问题的替代方案,例如P::RecD, Parse::Yapp, 和 Marpa
  • 保持自己的看法。 Perl 应该是有趣的。做你喜欢的事情; 只要准备好在不遵循建议并出现问题时受到抨击。 :P

1
在我使用 index 的所有时间里,我从未听说过 rindex!谢谢,我学到了新东西。我想现在我需要再次研究 perlfunc,因为我已经深入了解 Perl。 - Joel Berger
1
感谢您的时间和努力。 - AlexTheBird

4
我不知道这方面是否有任何“礼节”。
Perl正则表达式经过高度优化(这是该语言的一大特点,尽管有更快的引擎),最终,如果您的正则表达式如此简单,以至于可以用字符串函数替换,我不认为正则表达式会显著降低性能。如果您要解决的问题非常时间敏感,您可能需要考虑其他优化方法。
另一个重要方面是可读性。我认为通过正则表达式处理所有字符串转换也有助于此,而不是混合和匹配不同的方法。
以上是我的个人看法。

4

虽然我认为这个观点对于SO来说有点太主观,但我会提出我的看法。

当字符串具有以下特点时,请使用正则表达式:

  • “过于动态”(字符串可能有很多变化,使用字符串库会很麻烦)。
  • “包含模式”如果字符串存在真正的模式(可能只是一个字符或一组字符),这就是正则表达式优秀的地方。
  • “过于复杂”如果你发现自己需要声明整个函数块才能完成单一模式可以完成的任务,那么使用正则表达式就是值得的。(但是,也请参见下面的“过于复杂”)。

不要使用正则表达式来:

  • “快速” 考虑到启动正则表达式库所涉及的开销,与直接从字符串中获取信息相比。
  • “过于复杂” 好的代码并不总是简短的。如果您开始创建一个巨大的模式来规避几行代码,那很好,但请记住这可能会影响可读性。回到那段代码并再次尝试理解它可能不值得只是采用基本方法。

我认为你的意思是,代码越短,并不总是好的/更好的。 :-) - Wiseguy
是的,你说得对,当我表达问题时应该更具体一些。但尽管如此,我认为我收到了很多非常有用的回答。 - AlexTheBird

3

我认为,如果你需要使用超过一两个字符串函数调用来完成任务,那么就应该使用正则表达式。 ;)


我的答案假设正则表达式是完成任务的正确工具,而不需要一个合适的解析器。因此,这只涉及字符串函数与正则表达式的比较。 - Qtax
是的,我知道,我已经对Brad Christie说过,我对我的问题措辞不太满意。我并不是想用我的评论冒犯你,如果我有得罪你的话,我道歉了。 - AlexTheBird

2
Perl是一种非常适合正则表达式的语言。它有着任何语言中最好的解析器之一,这就是为什么你会看到很多“使用正则表达式”的答案。然而我不确定对正则表达式持反感态度的原因是什么。
我的答案是:你能否用一个模式来总结工作,比使用字符串函数更容易,或者是否需要使用多个字符串函数而不是一个正则表达式?无论哪种情况,我都建议使用正则表达式。否则,请按照自己的舒适程度去做。

2
既然我们在谈论正则表达式:s/PERL/Perlhttp://perldoc.perl.org/perlfaq1.html#What's-the-difference-between-%22perl%22-and-%22Perl%22%3f - Joel Berger
我认为只有当你真正使用正则表达式时,你才能看到它们的简洁和优雅。我猜这就是所有厌恶的原因所在。 - AlexTheBird
1
@AlexTheBird:我认为厌恶的另一个原因是学习曲线。其他类型的字符串比较等使用用户已经知道的编码实践。正则表达式是一种新的语法。 - Gregory A Beamer

2

对于不太复杂的问题,避免使用过于臃肿的正则表达式,影响代码可读性并导致性能问题。您可以通过一系列步骤、使用内置函数和其他手段来完成。虽然您可能没有一个酷炫的单行正则表达式,但您的代码将更易读且易于维护。

同样,对于过于简单的问题,也不要使用正则表达式,因为正则表达式是重量级的,通常有内置函数可以处理简单的场景。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接