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

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

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


当前回答

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

其他回答

问题是正则表达式潜在地非常强大,以至于可以使用它们做一些应该使用不同的东西来做的事情。

一个好的程序员应该知道在什么地方使用它们,在什么地方不使用。典型的例子是解析非常规语言(请参阅确定一种语言是否为常规语言)。

我认为如果一开始就限制自己使用真正的正则表达式(没有扩展),就不会出错。一些扩展可以使您的工作更简单一些,但是如果您发现一些很难用真正的正则表达式来表达的东西,这很可能表明正则表达式不是正确的工具。

我不认为人们反对正则表达式是因为它们很慢,而是因为它们很难读和写,而且很难正确。虽然在某些情况下,正则表达式为问题提供了一种有效的、紧凑的解决方案,但有时它们会被硬塞到使用易于阅读、可维护的代码部分更好的情况中。

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

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

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

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

虽然我认为正则表达式是一个必要的工具,但关于它们最烦人的事情是有不同的实现。语法、修饰语,尤其是“贪婪”的细微差异会让事情变得非常混乱,需要反复试验,有时还会产生令人困惑的错误。

在lex和yacc中用于编译器定义的正则表达式系统是很好的、非常有用和干净的。在这些系统中,表达式类型是根据其他表达式类型定义的。在perl和sed代码(等等)中常见的丑陋的畸形的不可读的行噪声巨型一行正则表达式是“有争议的”(垃圾)。