在探索正则表达式(也称为正则表达式)时,有许多人似乎将正则表达式视为圣杯。看起来如此复杂的东西——一定是任何问题的答案。他们倾向于认为每个问题都可以用正则表达式解决。

另一方面,也有很多人不惜一切代价试图避免正则表达式。他们试图找到一种绕过正则表达式的方法,并仅仅为了它而接受额外的编码,即使正则表达式将是一个更紧凑的解决方案。

为什么正则表达式被认为如此有争议?关于它们的工作原理是否存在广泛的误解?或者正则表达式通常比较慢是一种普遍的看法?


当前回答

这是一个有趣的话题。 许多regexp爱好者似乎混淆了公式的简洁性和效率。最重要的是,一个需要大量思考的regexp会给它的作者带来巨大的满足感,使它立即变得合法。

但是…当性能不是问题,并且需要快速处理文本输出时(例如在Perl中),regexp非常方便。此外,虽然性能是一个问题,但人们可能不愿意尝试使用可能有bug或效率较低的自制算法来击败regexp库。

此外,还有许多原因导致regexp受到不公平的批评

regexp效率不高,因为构建顶部的regexp并不明显 有些程序员“忘记”只编译一次要多次使用的regexp(就像Java中的静态模式) 有些程序员采用试错策略——regexp的效果更差!

其他回答

在某些情况下,我认为你必须使用它们。例如构建lexer。

在我看来,这是会写regexp的人和不会(或几乎不会)写regexp的人的观点。 我个人认为这是一个很好的想法,例如,有效的表单输入,它在javascript警告用户,或在服务器端语言。

我认为学习正则表达式和保持正则表达式不受欢迎, 大多数开发人员都很懒,或者他们中的大多数人都依赖于外部库来为他们做解析……他们依赖谷歌来获得答案,甚至在论坛上询问他们问题的完整代码。 但当涉及到实现或修改/维护正则表达式时,它们就会失败。

有一个流行的说法是“朋友不让朋友使用Regex来解析HTML”

但就我而言,我已经使用Regex制作了完整的HTML解析器,我发现我自己,Regex在解析HTML字符串方面更好,无论是速度方面还是内存方面(如果你有一个想法,你要实现什么:))

几乎我认识的每个经常使用正则表达式的人(双关语)都有unix背景,他们使用的工具将正则视为一级编程结构,比如grep、sed、awk和Perl。由于使用正则表达式几乎没有语法开销,因此它们的效率会大大提高。

相比之下,使用正则作为外部库的语言的程序员往往不会考虑正则表达式可以带来什么。程序员的“时间成本”是如此之高,以至于a) REs从未出现在他们的培训中,b)他们不会从REs的角度“思考”,而是更喜欢使用更熟悉的模式。

你可能会问为什么goto会有争议。

基本上,当你拥有这么多“显而易见”的权力时,人们倾向于在它们不是最佳选择的情况下滥用它们。例如,要求用正则表达式解析csv或XML或HTML的人的数量让我感到震惊。这不是做这项工作的合适工具。但是一些用户还是坚持使用正则表达式。

就我个人而言,我试图找到一个中庸之道——在正则表达式擅长的地方使用它们,在它们不是最优的时候避免使用它们。

请注意,正则表达式仍然可以用于解析csv、XML、HTML等。但通常不是在一个正则表达式中。

regex是一个很棒的工具,但是人们认为“嘿,多么棒的工具,我要用它来做X!”而X是另一个工具更适合做的事情(通常是解析器)。这是标准的使用锤子,你需要一个螺丝刀的问题。