当前位置:  开发笔记 > 编程语言 > 正文

正则表达式真的可以维护吗?

如何解决《正则表达式真的可以维护吗?》经验,为你挑选了6个好方法。

我见过的任何使用Regexes的代码都会将它们用作黑盒子:

    放入字符串

    魔术正则表达

    拿出字符串

在生产代码中使用这似乎不是一个特别好的主意,因为即使是一个小的改变通常也会导致完全不同的正则表达式.

除了标准是永久性和不变的情况之外,还是正确的做事方式,还是尝试不同的方法更好?



1> Sam Hasler..:

如果正则表达式很长并且难以理解,那么它们很难维护,那么就应该对它们进行评论.

许多正则表达式实现允许您使用空格和注释填充正则表达式.
请参阅http://www.regular-expressions.info/comments.html
和编码恐怖:正则表达式:现在您有两个问题

我见过的任何使用Regexes的代码都会将它们用作黑盒子:

如果用黑盒子表示抽象,那就是所有编程都是,试图抽象出困难的部分(解析字符串),这样你就可以专注于问题领域(我想要匹配哪种字符串).

即使是一个小小的变化通常也会导致一个完全不同的正则表达式.

任何代码都是如此.只要您正在测试正则表达式以确保它与您期望的字符串匹配,理想情况下使用单元测试,那么您应该有信心更改它们.

编辑:还请阅读杰夫关于生产代码的答案的评论.


在生产代码中更改它们永远不会让您感到舒适.相反,它们应该在测试服务器上更改(应该始终与生产服务器相同,除非测试代码不同),测试并推送到您的prod服务器.改变产品代码:坏,Mkay?

2> Joel Coehoor..:

强制性的.

这真的归结为正则表达式.如果这是一个巨大的单片表达式,那么是的,这是一个可维护性问题.如果你可以简洁地表达它们(也许是通过分解它们),或者如果你有很好的评论和工具来帮助你理解它们,那么它们就可以成为一个强大的工具.



3> jkramer..:

我不知道您正在使用哪种语言,但Perl(例如)支持该x标志,因此除非转义,否则在正则表达式中忽略空格,因此您可以将其分成几行并对内联的所有内容进行注释:

$foo =~ m{
    (some-thing)          # matches something
    \s*                   # matches any amount of spaces
    (match another thing) # matches something else
}x;

这有助于使长正则表达式更具可读性.


对于知道正则表达式的人来说,这些评论等同于"i ++; //为i添加一个

4> DMKing..:

如果你不理解正则表达式,它似乎只是魔术.生产代码中的任何小的变化都可能导致重大问题,因此在我看来,这不是一个很好的理由,不使用正则表达式.彻底的测试应该指出任何问题.



5> Tanktalus..:

任何语言的任何代码进行微小更改都可能导致完全不同的结果.其中一些甚至阻止了编译.

用"C"或"C#"或"Java"或"Python"或"Perl"或"SQL"或"Ruby"或"awk"代替正则表达式或者......真的,你得到同样的问题.

正则表达式只是另一种语言,霍夫曼编码在字符串匹配方面效率很高.就像Java,Perl,PHP或者特别是SQL一样,每种语言都有优点和缺点,当你编写(或维护它)以获得高效的希望时,你需要知道你正在编写的语言.

编辑:迈克,正则表达式是霍夫曼编码,因为常见的事情要比简单的东西短.文本的文字匹配通常是单个字符(您要匹配的字符).存在特殊字符 - 常见字符很短.特殊构造,例如(?:)更长.这些与Perl,C++等通用语言中常见的不同,因此霍夫曼编码的目标是此专业化.



6> OregonGhost..:

复杂的正则表达式对我来说是不容易忘记的.写它,测试它,当它工作时,写一个评论它做什么,我们很好.

但是,在许多情况下,您可以将正则表达式细分为较小的部分,也可以编写一些结合了这些正则表达式的文档齐全的代码.但是如果你在代码中找到一个多行正则表达式,你最好不要那个必须维护它的人:)

听起来很熟悉?这或多或少都适用于任何代码.你不想拥有很长的方法,你不想拥有很长的类,并且你不想拥有很长的正则表达式,尽管方法和类更容易重构.但实质上,它是相同的概念.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有