繁体   English   中英

正则表达式工具(如RegexBuddy)是个好主意吗?

[英]Are regex tools (like RegexBuddy) a good idea?

我的一位开发人员已经开始使用RegexBuddy来帮助解释遗留代码,这是我完全理解和支持的一种用法。 我担心的是使用正则表达式工具编写新代码。 我实际上不鼓励在我的团队中使用新代码。 两个引号浮现在脑海中:

有些人在面对问题时会想“我知道,我会使用正则表达式”。 现在他们有两个问题。 - 杰米·扎温斯基

和:

调试的难度是首先编写代码的两倍。 因此,如果您尽可能巧妙地编写代码,那么根据定义,您不够聪明,无法对其进行调试。 - Brian Kernighan

我担心的是(分别:)

  • 该工具可以使用真正不需要它的复杂正则表达式来解决问题。 (另见这个问题 )。

  • 我的一个开发人员,使用正则表达式工具,将开始编写正则表达式(即使有注释)也不能由没有(并且知道如何使用)正则表达式工具的任何人维护。

我应该鼓励还是不鼓励使用正则表达式工具,特别是在生成新代码方面? 我的担忧是否合理? 还是我是偏执狂?

糟糕的编程很少是工具的错误。 开发人员不理解该工具是错误的。 对我来说,这就像是说木匠不应该拥有一把螺丝刀,因为他可能会使用一个螺钉,钉子会更合适。

正则表达式只是您可以使用的众多工具之一。 我一般不同意经常引用的Zawinski引用,就像任何技术或技术一样,有好的和坏的方法来应用它们。

就个人而言,我认为像RegexBuddy和免费的Regex Coach这样的东西主要是学习工具。 有时候它们可以帮助调试或理解现有的正则表达式,但一般来说,如果你使用工具编写正则表达式,那么维护它就很难了。

作为Perl程序员,我非常熟悉正常表达式的好坏,并且多年来一直在生产代码中成功使用复杂的正则表达式。 以下是我喜欢从各个地方收集的一些指导原则:

  • 当字符串匹配时,不要使用正则表达式。 我经常看到人们使用正则表达式的代码,以便不区分大小写匹配字符串。 只需对字符串进行小写或大写,然后执行标准字符串比较。
  • 不要使用正则表达式来查看字符串是否是几个可能的值之一。 这不必要地难以维护。 而是将可能的值放在数组中,哈希(无论您的语言提供什么),并根据这些值测试字符串。
  • 写测试! 拥有一组专门针对正则表达式的测试可以使开发变得更加容易,特别是如果它是一个模糊的复杂的。 此外,一些测试通常可以回答维护程序员可能对您的正则表达式提出的许多问题。
  • 用较小的部分构造你的正则表达式。 如果你真的需要一个复杂的大型正则表达式,可以用较小的,可测试的部分构建它。 这不仅使开发更容易(因为您可以单独确定每个较小的部分),但它也使代码更具可读性,灵活性并允许进行彻底的注释。
  • 将正则表达式构建为专用的子例程/函数/方法。 这使得为​​正则表达式( 只有正则表达式)编写测试非常容易。 它还使得使用正则表达式的代码更容易阅读(一个名称很好的函数调用比随机标点符号块要小得多!)。 将巨大的正则表达式放入代码块的中间(它们不能单独进行测试)是非常常见的,通常很容易避免。

您应该鼓励使用可以提高开发人员效率的工具。 话虽如此,确保他们使用正确的工具来完成工作非常重要。 您需要教育所有团队成员何时适合使用正则表达式,以及何时(less|more)强大的方法。 最后,任何正则表达式(IMHO)都应该进行全面评论,以确保下一代开发人员能够维护它。

我不确定为什么对正则表达式有这么多的不信任。

是的,它们可能会变得混乱和模糊,就像有人可能编写的任何其他代码一样,但它们比代码更有优势:它们代表了一个人们感兴趣的字符串集,这是正式指定的方式(至少通过你的语言,如果有的话)是扩展)。 了解一段代码接受哪组字符串将需要“逆向工程”代码。

当然,你可以像使用递归和goto那样使用正则表达式,但只有在有一个好的选择时才能证明这是正确的。

我宁愿维护单行正则表达式代码而不是试图捕获一组字符串的复杂的手工制作函数。

在使用工具来理解正则表达式(或写一个新的)时,我认为它非常好! 如果有人用这个工具写的话,别人可以用工具来理解它! 实际上,如果你担心这个问题,我会看到像RegexBuddy这样的工具是你最好的保险,代码不会因为正则表达式而无法维护

正则表达式测试工具非常宝贵。 我一直都在使用它们。 我的工作甚至没有特别严重的正则表达式,因此在我建立知识库时有一个程序来指导我完成细微差别是至关重要的。

正则表达式是很多文本处理问题的好工具。 如果团队中有人正在编写团队其他成员不理解的正则表达式,那么为什么不让他们教你们其他人如何工作呢? 你可能会把这视为机遇,而不是威胁。 这样你就不必感受到未知的威胁,你将在你的武器库中拥有另一个非常有价值的工具。

Zawinski的评论虽然有趣,但从根本上说是无知的表现,而正则表达式并不是整个编码所以我不会担心这些引用。 无论如何,没有人能够将整个论证变成一个单行。

如果你遇到一个过于复杂而无法理解的正则表达式,那么正则表达式对于那个特定问题可能不是一个好的解决方案,但这并不意味着它们没有用处。 我愿意打赌,如果你故意避免使用它们,你的代码库中会有许多代码行,而单一的,简单的Regex就可以完成同样的工作。

Regexbuddy是一个有用的快捷方式,以确保您正在编写的正则表达式符合您的预期 - 它确实使生活变得更轻松,但这就是使用它们的问题,这对我来说对您的问题似乎很重要。

像其他人所说,我认为使用或不使用这样的工具是一个中立的问题。 更重要的是:如果正则表达式如此复杂以至于需要内联注释,那就太复杂了。 我从不评论我的正则表达式。 我将大型或复杂的匹配问题分解为几个匹配步骤,或者使用多个匹配语句(=〜),或者通过构建带有子regexp的正则表达式来处理大型或复杂的匹配问题。

说了这么多,我认为任何值得他的盐的开发者应该在正则表达式写作和阅读方面相当精通。 我多年来一直在使用正则表达式,从来没有遇到过我需要编写或读取非常复杂的表达式的时间。 但是,适度大小的方法可能是进行验证或匹配的最优雅和简洁的方法,并且不应该仅仅因为缺乏经验的开发人员无法阅读它而更好地避开正则表达式 - 更好地教育该开发人员。

应该做的是让你的其他开发者与RB联系起来。

不要担心整个“2 probs”的引用; 似乎可能是Perl(1997年回称)不是正则表达式。

我不喜欢使用正则表达式工具。 如果我不能手工编写,那么这意味着工具的输出是我不理解的,因此无法维护。 我更愿意花时间阅读一些正则表达式功能,而不是学习正则表达式工具。 我不理解许多程序员的态度,即正则表达式是一种要避免/隔离的黑色艺术。 这只是另一种需要学习的编程语言。

完全有可能一个正则表达式工具可以节省我一些时间来实现我所知道的正则表达式功能,但我怀疑它...我可以很快地输入,如果你理解语法很好(使用文本编辑器,其中正则表达式是惯用的帮助 - 我使用gVim),大多数正则表达式确实不那么复杂。 我认为通过更好地学习技术而不是学习拐杖,你几乎总是能得到更好的服务,除非这个工具可以放入简单的信息并获得大量的样板代码。

嗯,这听起来像是一个聪明的人引入一个正则表达自己匹配的正则表达式工具。 这表明使用工具并不是问题,因为工具理解的内容与程序员理解的内容之间是否存在巨大差距。

因此,文档可以提供帮助。

这是一个真正的简单例子,如下表(只是一个建议)

Expression        Match     Reason
^                 Pos 0     Start of input
\s+               "      "  At least one space
(abs|floor|ceil)  ceil      One of "abs", "floor", or "ceil"
...

不过,我看到了这个问题。 您可能希望阻止人们构建比解析更复杂的正则表达式。 我认为标准可以通过始终要求扩展的RE并检查注释是否正确来解决这个问题。

但是,如果他们只是想调试RE,以确保它的行为正如他们认为的那样,那么它与编写必须调试的代码并没有太大的不同。

这是相对的。

我制作的几个正则表达式工具(用于Node / JSPHPPython )(用于其他一些项目)可以在线进行播放和实验。

正则表达式分析器正则表达式作曲家

github回购

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM