了解正则表达式有多重要?

时间:2009-02-06 11:16:42

标签: regex

我的个人经验是,正则表达式解决了无法以其他方式有效解决的问题,并且在字符串同样重要的世界中经常需要,因为没有牢牢掌握主题就足够了我之所以考虑雇用你作为高级程序员(一个大三学生总是被允许有训练的余地)。

然而

对经常出现的“正则表达式是什么?”的一些回应?类型问题表明,很多程序员发现它们介于难以理解和不透明之间。

这不是关于简单的indexOf或子串是否是更好的解决方案,这是一个技术问题,有时简单的方法是正确的,有时是正则表达式,有时也不是(查看你的html解析器问题)。

这是关于理解正则表达式的重要性以及反正则表达式的观点(陈述“......现在它们有两个问题”的东西)是值得的还是FUD。

是否应该让程序员了解正则表达式?这是必需的技能吗?


编辑:以防万一不清楚,我不是在问是否需要学习它们(我是信仰的捍卫者),而是反...阵营是一个进化的死胡同,或者它是否是像InstallShield 这样不必要的利基技能。

16 个答案:

答案 0 :(得分:26)

RE让您解决相对复杂的问题,否则您需要使用回溯编写完整的解析器以及所有混乱的东西。我把RE的使用比作使用链锯来砍伐一棵树,而不是试图用一块芹菜来做。

一旦你学会了如何安全地使用电锯,你就永远不会回去了。那些继续兜售反RE宣传的人永远不会像那些学会爱他们的人一样富有成效。

所以是的,你应该知道如何使用RE,即使你只理解基本结构。它们就像其他任何工具一样。

答案 1 :(得分:18)

有些任务中正则表达式是最好的工具 有些任务正则表达式毫无意义 有些任务是合理合适的,但不同的方法可能更具可读性。

一般来说,我想在涉及实际的模式时使用正则表达式。如果你只是在寻找一个特定的字符串,我通常不会使用正则表达式。作为灰色区域的一个例子,有人曾经在新闻组上询问检查一个字符串是否包含任何其他字符串的最佳方法。出现的两种方式是:

  • 使用替代方案构建正则表达式并执行单个匹配。
  • 使用string.Contains依次测试每个字符串。

我个人认为后一种方式很多更简单 - 它不需要考虑转义你正在寻找的字符串,或任何其他正则表达式的知识(以及它们的不同风格)不同的平台)。

作为某个地方的例子,正则表达式显然是错误的选择,有人认真地建议使用正则表达式来测试字符串是否长三个字符。他们的正则表达式甚至没有奏效,尽管他们声称他们首先考虑正则表达式的原因是因为他们长期使用它们,并且它们在正则表达式中自然有点“思考”。

然而,有很多例子,正则表达式确实让生活更轻松 - 正如我所说,当你实际匹配模式时:“我想要一个字母,然后三个数字,然后另一封信“或其他什么。我没有经常使用正则表达式,但是当我使用它们时,它们可以节省大量的工作。

简而言之,我相信知道正则表达式会很好 - 但同样要注意何时使用它们。很容易得到只写代码,通过简单的字符串操作重写可以使其更容易理解,即使结果代码稍微长一些。

编辑:回复编辑问题......

我认为对他们进行福音派不是一个好主意 - 根据我的经验,倾向于导致在替代方案更简单的情况下使用它们,这只会让你看起来很糟糕。另一方面,如果你遇到有人编写复杂的代码来避免使用正则表达式,那么可以指出正则表达式会使代码更简单。

就个人而言,我喜欢以非常详细的方式评论我的正则表达式,将它们分成几行,每行之间有注释。这样他们就更容易维护,看起来你只是想成为“硬核”怪人(即使它不是真正的预期目标,可以成为印象) )。

我认为最重要的是要记住那短!=可读。从来没有声称使用正则表达式更好,因为它需要更少的代码 - 声称它更好,当它真正更简单和更容易理解(或当然有显着的性能优势)。

答案 2 :(得分:6)

作为开发人员,您应该了解尽可能多的工具的优缺点,这些工具可以为您的问题提供预先制定的解决方案。每个开发人员都应该知道如何使用正则表达式,并且感觉何时应该使用它们以及何时使用简单的字符串函数来实现目标。

在我看来,完全拒绝它们是因为它们难以阅读。一个认为如此的开发人员剥夺了他自己搜索和验证复杂字符串模式的宝贵工具。

答案 3 :(得分:3)

在Steve Yegge的文章Five Essential Phone Screen Questions中,您应该阅读“第三区:脚本和正则表达式”部分。

Steve Yegge有一些有趣的观点。他提出了他遇到的现实问题,客户必须为特定的电话号码模式解析50,000个文件。知道正则表达式的申请人会在几分钟内解决问题,而那些不会编写非常笨重的怪物百线程序的人。这篇文章让我确信我应该学习正则表达式。

答案 4 :(得分:3)

我的感情真的很复杂。我已经使用过它们并且知道语法的骨骼,而且我喜欢它们的简洁性。然而,它们通常不被理解,并且是高度混淆的代码形式。我也希望在普通代码中看到与类似操作的性能比较。毫无疑问,分解代码将更易于维护,更容易和更广泛地理解,这是任何商业软件项目中的一个重要考虑因素。

即使它们变得更高效,它们的逻辑结论也会让我们将汇编程序嵌入到我们的代码中以获得重要的循环 - 也许我们应该这样做。整洁,简洁,快速,但几乎无法维护。

总的来说,我认为在正则表达式语法成为主流之前,他们可能会比他们解决的问题更麻烦,并且应该非常小心地使用。

答案 5 :(得分:2)

不是一个出色的答案,但无论我在哪里工作,以下都是正确的

0< (完全)了解正则表达式的人数< 1

如果我知道怎么做,我会将之前的表达式写为正则表达式,但我不能。我能想到的最好的是s / full / a / / - 这是我的极限(这可能不是正则表达式)。

更严肃的答案是,正确的正则表达式将解决所有类型的问题,使用一行(ish)代码。但如果出现问题,你会遇到调试问题。因此,恕我直言,复杂的正则表达式,但“干净/聪明”是一种负担,如果它需要十行代码来复制它,为什么这是一个问题,内存/磁盘空间突然再次昂贵?

顺便说一下,我很想知道正则表达式是否比同等代码快。

答案 6 :(得分:2)

目前尚不清楚你期待什么样的答案。

我可以想象这个问题大致有三种答案:

  1. Regexen对专业程序员的教育至关重要。它们可以使用功能强大的unix shell工具,而基于正则表达式的搜索替换可以大大减少文本调整的手工作业,这是程序员生活中的一部分。不懂regexen的程序员只是在懒惰中,这对于程序员来说是一个非常糟糕的特性。

  2. 根据应用程序域的不同,正则表达式很有用。当然,知道如何编写正则表达式是程序员胸前的一个有价值的工具,但大多数时候你可以在不使用它们的情况下做得很好。此外,regexps往往很难阅读,因此必须强烈建议不要滥用。

  3. 有些坚果喜欢把正则表达式放在一切(我正在看着你,perl家伙在perl中实现了一个基于正则表达式的俄罗斯方块)。但实际上,它们只是一些计算机科学的琐事,其唯一的实际用途是编写解析器。他们被广泛传授,因为他们提出了一个很好的教学主题来评估学生,像大多数这样的话题,它可以忘记你走出考场的第二个。

  4. 你会注意到使用复数形式“regexen”(pro),“regexps”(小心中性)和“regexs”(con)。

    就个人而言,我属于第一类。优秀的程序员喜欢学习新语言,他们讨厌重复的手工作业。

答案 7 :(得分:2)

当你必须解析一些东西(从简单的日期字符串到编程语言)时,你应该知道你的工具和正则表达式就是其中之一。

但你也应该知道你可以用正则表达式做什么,什么不行。此时,如果您知道Chomsky hierarchy 层次结构,它会派上用场。否则,您最终会尝试使用正则表达式来解析上下文相关的语言,并想知道为什么无法正确使用正则表达式。

答案 8 :(得分:2)

所有语言都支持正则表达式的事实应该是某些东西

答案 9 :(得分:2)

我认为了解正则表达式是一项非常重要的技能。虽然在编程环境/语言中使用正则表达式是可维护代码的问题,但我发现正则表达式的知识对某些命令(比如egrep),编辑器(vim,emacs等)很有用。使用正则表达式在vim中进行查找和替换非常方便,如果您有一个文本文件,并且想要偶尔进行一些格式化。

答案 10 :(得分:1)

我发现了解正则表达式非常有用。它们是一个非常强大的工具,在我看来,如果没有这些问题,你就无法解决这些问题。

然而,我不会将正则表达式作为“雇用你作为高级程序员”的杀戮标准。它们就像世界上其他工具一样丰富。你应该在你需要它们的问题域中真正了解它们,但你不能假设有人已经知道所有这些。

  

“一个大三学生总是被允许留有余地   培训“

如果大四不是,那我就不会雇用他了!

那些认为正则表达式是多么复杂和难以理解的人:如果问题的正则表达式解决方案复杂且难以理解,那么问题本身可能就是问题!祝你以另一种方式解决问题......

答案 11 :(得分:0)

以下是做什么的?

“([A-ZA-Z] [A-ZA-Z0-9 + .-] {1120}:A-ZA-Z0-9 / {1333}(#([A-ZA-Z0-9 !?] [A-ZA-Z0-9 $ _ + *,/:@&安培;〜=% - ] {0,1000})))“

你需要多长时间才弄明白?调试?

正则表达式对于一次性使用的一次性程序来说非常棒,但是长毛的正则表达式不是其他人多年来需要维护的程序的最佳选择。

答案 12 :(得分:0)

我发现正则表达式非常有用,具体取决于你所做的编程类型。然而,我可能每个月写一个正则表达式不到一个,并且由于需要正则表达式之间的这么长的间隔我忘记了它们的工作方式。

我应该在某一天掌握正则表达式或类似的东西。

答案 13 :(得分:0)

了解何时使用正则表达式以及它们如何工作的基础知识以及它们的局限性非常重要。但是,用你可能不会经常需要的许多语法规则来填充你的头脑只是一个毫无意义的学术练习。

regexp婴儿床床单可以写在一张A4纸上,也可以写在教科书中的几页上 - 不需要知道这些东西,如果你每天都使用它会粘住。如果你不经常使用它,那么脑细胞可能更好地用于其他东西。

答案 14 :(得分:-1)

开发人员认为他遇到了一个问题并尝试使用正则表达式来解决它。现在他有两个问题。

答案 15 :(得分:-1)

我同意这里所说的一切,只需要包括强制性的讽刺:

  有些人在面对的时候   问题,想想“我知道,我会用   正则表达式。“现在他们有   两个问题。

(归功于Jamie Zawinski)

像大多数笑话一样,它包含了一个真实的核心。