在探索正则表达式(也称为正则表达式)时,有许多人似乎将正则表达式视为圣杯。看起来如此复杂的东西——一定是任何问题的答案。他们倾向于认为每个问题都可以用正则表达式解决。
另一方面,也有很多人不惜一切代价试图避免正则表达式。他们试图找到一种绕过正则表达式的方法,并仅仅为了它而接受额外的编码,即使正则表达式将是一个更紧凑的解决方案。
为什么正则表达式被认为如此有争议?关于它们的工作原理是否存在广泛的误解?或者正则表达式通常比较慢是一种普遍的看法?
在探索正则表达式(也称为正则表达式)时,有许多人似乎将正则表达式视为圣杯。看起来如此复杂的东西——一定是任何问题的答案。他们倾向于认为每个问题都可以用正则表达式解决。
另一方面,也有很多人不惜一切代价试图避免正则表达式。他们试图找到一种绕过正则表达式的方法,并仅仅为了它而接受额外的编码,即使正则表达式将是一个更紧凑的解决方案。
为什么正则表达式被认为如此有争议?关于它们的工作原理是否存在广泛的误解?或者正则表达式通常比较慢是一种普遍的看法?
当前回答
我发现正则表达式有时是无价的。当我需要做一些“模糊”搜索时,可能会替换。当数据可能变化,具有一定的随机性时。 然而,当我需要做一个简单的搜索和替换,或检查字符串,我不使用正则表达式。尽管我知道很多人这样做,但他们什么都用它。这就是争议所在。
如果你想在墙上钉钉子,不要用锤子。是的,它会起作用,但等你拿到锤子,我可以在墙上钉20个钉子。
正则表达式应该用于它们设计的目的,而不是别的。
其他回答
我不认为他们有那么大的争议。
我也认为你已经回答了你自己的问题,因为你指出到处使用它们(不是所有的语言都是常规语言2)或根本避免使用它们是多么愚蠢。作为程序员,您必须做出一个明智的决定,即正则表达式何时有助于代码,何时有害于代码。当面临这样的决定时,要记住两件重要的事情:可维护性(这意味着可读性)和可扩展性。
对于那些特别讨厌它们的人,我猜他们从来没有学会正确使用它们。我认为大多数人只要花上几个小时学习一些不错的教程,就能很快掌握并熟练使用这些语言。以下是我的建议:
http://docs.python.org/howto/regex
尽管该页讨论的是Python上下文中的正则表达式,但我发现这些信息在其他地方也非常适用。有一些东西是python特有的,但我相信它们被清楚地指出来了,而且很容易记住。
我觉得"有争议"这个词不太合适。
但我见过无数的例子,人们会问“我需要什么正则表达式来做这样那样的字符串操作?”这是X-Y问题。
换句话说,他们从假设regex是他们需要的开始,但是他们最好使用split(),一个像perl的tr///那样的转换,其中字符被一个替换为另一个,或者只是一个index()。
问题是正则表达式潜在地非常强大,以至于可以使用它们做一些应该使用不同的东西来做的事情。
一个好的程序员应该知道在什么地方使用它们,在什么地方不使用。典型的例子是解析非常规语言(请参阅确定一种语言是否为常规语言)。
我认为如果一开始就限制自己使用真正的正则表达式(没有扩展),就不会出错。一些扩展可以使您的工作更简单一些,但是如果您发现一些很难用真正的正则表达式来表达的东西,这很可能表明正则表达式不是正确的工具。
在某些情况下,我认为你必须使用它们。例如构建lexer。
在我看来,这是会写regexp的人和不会(或几乎不会)写regexp的人的观点。 我个人认为这是一个很好的想法,例如,有效的表单输入,它在javascript警告用户,或在服务器端语言。
这是一个有趣的话题。 许多regexp爱好者似乎混淆了公式的简洁性和效率。最重要的是,一个需要大量思考的regexp会给它的作者带来巨大的满足感,使它立即变得合法。
但是…当性能不是问题,并且需要快速处理文本输出时(例如在Perl中),regexp非常方便。此外,虽然性能是一个问题,但人们可能不愿意尝试使用可能有bug或效率较低的自制算法来击败regexp库。
此外,还有许多原因导致regexp受到不公平的批评
regexp效率不高,因为构建顶部的regexp并不明显 有些程序员“忘记”只编译一次要多次使用的regexp(就像Java中的静态模式) 有些程序员采用试错策略——regexp的效果更差!