大多数开发人员都不能很好地理解正则表达式。同样令我感到震惊的是,对于使用正则表达式的许多问题,可以使用代码来代替。当然,对于像电子邮件验证这样的东西,它可能会更慢并且是20行,但如果代码的性能不是非常重要,那么假设不使用正则表达式可能是更好的做法是否合理?
我在考虑维护代码而不是直线执行时间。
答案 0 :(得分:49)
维护一个正则表达式比维护20行代码要少得多。而且你低估了所需的代码量 - 对于任何复杂性的正则表达式,替换代码很容易就是200而不是20行。
答案 1 :(得分:42)
至少。多年来,我一直是一名专业开发人员,我没有遇到过一个不知道正则表达式是什么的开发人员。这是真的,不是每个人都喜欢使用它们或者非常擅长了解它的语法,但这并不意味着不应该使用它们。开发人员应该学习语法并使用正则表达式。
就像:“好的。我们有Lambda表达式,但是谁在乎,我仍然可以用老式的方式来做。”
不学习专业发展的关键方面是纯粹的懒惰,不应该长期容忍。
答案 2 :(得分:23)
每当我使用正则表达式时,我总是试着留下评论,准确解释它的结构,因为我同意你的看法并非所有开发人员都理解它们并回到正则表达式,即使你自己编写了它,也可能是头疼再次理解。
那就是说,他们肯定有自己的用途。尝试从没有它的文本框中删除所有html元素!
答案 3 :(得分:13)
我在考虑维护代码而不是直线执行时间。
代码大小是降低可维护性的最重要因素。
虽然Regexps很难破译,但50行字符串处理方法也是如此 - 后者更容易在罕见的极端情况下包含错误。
事情是:任何非平凡的正则表达式都必须被评论,就像你评论50行方法一样彻底。
答案 4 :(得分:7)
正则表达式是一种特定于域的语言:没有通用的编程语言在使用正则表达式执行字符串匹配时非常有表现力或非常有效。您必须使用标准编程语言(即使是具有良好字符串库的语言)编写的代码块的大小将使其难以维护。这也是一个很好的分离关注点,以确保正则表达式只进行匹配。拥有一个基本上匹配的代码blob,但在其间做其他事情会产生一些令人惊讶的错误。
另请注意,有一些机制可以使正则表达式更具可读性。在Python中,您可以启用详细模式,它允许您编写如下内容:
a = re.compile(r"""\d + # the integral part
\. # the decimal point
\d * # some fractional digits""", re.X)
另一种可能性是从字符串构建正则表达式,按行和注释每一行,如下所示:
a = re.compile("\d+" # the integral part
"\." # the decimal point
"\d *" # fraction digits
)
在大多数编程语言中,这可能以不同的方式实现。我的建议是在适当的时候继续使用正则表达式,但是像对待其他代码一样对待它们。尽可能清楚地写出来,评论并测试它们。
答案 5 :(得分:4)
关于可维护性,你提出了一个非常好的观点。正则表达式可能需要一些解密才能理解,但我怀疑代替它们的代码会更容易维护。正则表达式非常强大,是一种有价值的工具。使用它们但仔细使用它们,并考虑如何明确正则表达式的意图。
此致
答案 6 :(得分:4)
强大的力量带来了巨大的责任!
正则表达式很棒,但可能会过度使用它们!并非所有情况都适用!
答案 7 :(得分:2)
我看到的最麻烦的是当人们试图用正则表达式解析非常规语言时(是的,包括所有编程和许多标记语言,是的,也是HTML)。 我有时希望所有程序员都必须证明他们在允许使用正则表达式之前至少理解了无上下文和常规语言之间的区别。或者,他们可以在尝试使用它们解析非常规语言时将其正则表达式许可证撤销。是的,我在开玩笑,但只有一半。
当人们尝试在正则表达式中进行多次字符匹配时会出现下一个问题,例如,检查有效日期,甚至可能包括闰年考虑因素(这也可能导致正则表达式许可证撤销)。
正则表达式实际上只是有限状态自动机的一种方便的简写(你知道那是什么,不是吗?你的正则表达式许可证在哪里?)。问题来自人们期待他们的某种魔力,而不是来自正则表达本身。
答案 8 :(得分:2)
将正则表达式视为字符串处理的语言Franca。如果您要以专业身份进行编码,您只需要了解它们。除非你只是写SQL。
答案 9 :(得分:2)
在我看来,使用常规表达来强制执行更好的做法可能更有意义,而不是一起放弃。
使用正则表达式有一些优点:
答案 10 :(得分:1)
乍一看,正则表达式可能是正确的,这一点要容易得多。当我编写一个简单的单行正则表达式时,为什么我会在代码中编写一个长状态机(可能首先包含bug)?
正则表达式可能被认为是“只写”,但我认为这有时是一种好处。从头开始编写一个相对简单的正则表达式时,很容易做到正确。
答案 11 :(得分:1)
我想补充一点,单元测试是使正则表达式可维护的理想方法。我认为Regex是一种必不可少的开发人员技能,它始终是编写多行字符串操作代码的实用替代方法。
答案 12 :(得分:1)
没错,学习解密正则表达式很困难 - 但首先要学习破译宿主程序代码。但这是如此困难,以至于我们宁愿为一个人写出手动指令吗?不 - 因为这将是荒谬的更长和复杂。不使用正确形式的正则表达式也是一样。
答案 13 :(得分:1)
我绝不希望编程中的选项更少。正则表达式可以非常强大,但确实需要技巧。我喜欢可以通过几行代码解决的问题。真正很酷的是,可以完成多少验证元素。只要代码在表达式检查的内容上发表评论,我就不会发现问题。我也从未见过专业程序员不知道什么是正则表达式。它是工具箱中的另一个工具。
答案 14 :(得分:1)
我发现使用reg ex它更容易维护,但微调别人的reg ex有点痛苦。我认为你低估了开发人员的说法,大多数人都不理解。通常我发现,随着时间的推移,需求会调整,用于验证某些内容的正则表达式不再有效,并且尝试删除不再有效的部分比仅重写整个部分更难。
另外,想象一下,如果您正在验证电话号码,并且您决定使用代码而不是reg ex。所以相当于让我们说20行。随着时间的推移,贵公司决定扩展到现在电话验证不再完全正确的其他地区。所以你必须调整它以适应其他要求。代码可能难以维护,因为您必须调整超过20行代码,而不是简单地删除旧的reg ex,并将其替换为新的代码。
但是,我认为代码可以在某些情况下与正则表达式一起使用。例如,假设您要验证美国电话号码,在每种情况下,它都有10位数字,但实际上有很多方法可以写出来。例如(xxx)xxx-xxxx,或xxx-xxx-xxxx,或xxx xxx xxxx等,等等。因此,如果您编写reg ex,则必须考虑每个案例。但是,如果您只是使用正则表达式替换所有非数字和空格,那么请再次传递并检查它是否有10位数,您会发现它比编写电话号码的每种可能的方法更容易。
答案 15 :(得分:1)
在.NET正则表达式中你可以有注释,并将它们分成多行,使用缩进等(我不知道其他方言......)
使用“忽略模式空白”设置,使用#来注释掉其余部分,或者使用模式中的“(#comments)”...
因此,如果您愿意,您实际上可以使它们具有可读性/可维护性......
答案 16 :(得分:1)
我将正则表达式看作是对字符串数据执行模式匹配的快速,可读和可取的方法。因此,许多语言支持正则表达式。如果你想编写字符串操作代码来匹配say,加拿大邮政编码,作为我的客人,但正则表达式相当于更加简洁。绝对值得。
答案 17 :(得分:1)
似乎没有提到的一件事(从快速扫描上面的答案)是正则表达式在代码之外也是有用的。这意味着它们对于编码人员甚至最终用户来说都是值得的。
例如,我刚为格式化程序编写了一堆单元测试。然后我制作了一个测试副本,并在我的编辑器中使用了一个正则表达式来反转值和结果字符串(也改变了方法名称),给字符串预期值解析......
另一个例子:在我们的产品中,我们允许使用正则表达式来搜索或过滤数据列:有时只获取以某些东西开头的名称,以某些东西结尾,字母后跟数字或类似的名称:不需要成为正则表达的使用者。
在这些情况下,编写代码不是一个选项(好吧,我可以在第一种情况下制作一个小的Lua脚本,但它会更长)并且性能不是主要问题。
但是即使在代码中,我经常发现使用简单的正则表达式比使用具有复杂偏移和诸如此类的一堆substring()更容易和更易读。除此之外,它们还可以验证用户输入,同样,性能也不是问题。
答案 18 :(得分:0)
VB.net是最好的,不,C#是,没有F#是最好的。在我看来,这更多的是人们保持更适合处理的问题。这更像是一个火焰问题,而不是绝对可以回答的问题。
我个人会选择正则表达式,只要有复杂的字符串验证(电话号码,电子邮件,ss#,ip地址),那里有众所周知的正则表达式。从regex.org获取,给予评论归属和/或以适当的方式获得作者的许可,并完成它。
此外,为了提取字符串,或复杂的字符串拆分,正则表达式可以节省大量时间。
但如果你自己编写,而不是使用其他人,使用regex buddy或者销售兄弟regexdesigner之类的东西是测试和验证的必备条件。
答案 19 :(得分:0)
正则表达式是众多工具中的一种。但是,正如许多工匠将要证明的那样,你拥有的工具越多,你使用它们的技能就越高,你就越有可能成为一名工匠大师。
Regex值得你麻烦吗?不知道。取决于你对你所做的事情的认真态度。
答案 20 :(得分:0)
我刚遇到这个问题。我构建了一个正则表达式,用于从一长串数字和一些其他噪声中提取数据组。正则表达式很长,虽然简洁,当我试图将它添加到我写的C#应用程序时,它变得更大。 reg ex总共有3行代码。
然而,在我为C#转义之后看到它是痛苦的,而我与之合作的其他开发人员并没有遵守正则表达式。我最终剥离了大部分噪音字符,并在空间上分割以获取数据组。非常简单的代码,只有5行。
哪个更好?我的自我说正则表达。任何新雇员都会说剥离角色。
答案 21 :(得分:0)
所有代码都需要尽可能优化!
在不需要优化代码的情况下,需要维护逻辑,然后降低到团队的技能组合。
如果负责代码的大部分团队精通regEX,那么请使用regEX进行操作。另外,按照团队最熟悉的方式编写它。
答案 22 :(得分:0)
当然,正则表达式是一个非常有用的工具,但我同意它们被过度使用并且过于复杂,这很容易成为一个简单的解决方案。
话虽如此,只要情况需要,你应该使用正则表达式。某些内容(例如在字符串中搜索文本)可以通过迭代搜索(或使用API搜索)轻松完成,但对于更复杂的情况,您需要使用正则表达式。
答案 23 :(得分:0)
由于我构建的应用程序类型,我经常使用的唯一RegEx是用于电子邮件验证,html剥离和角色剥离以消除电话号码周围的垃圾。
除了连接之外,我很少需要进行非常多的字符串操作。
顺便提一下,这些应用通常都是CRM。
因此,对我来说,麻烦只限于在我发现自己需要的情况下使用Google搜索正则表达式。 ;)