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

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

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


当前回答

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

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

其他回答

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

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

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

“正则表达式:现在你有两个问题”是Jeff Atwood关于这个问题的一篇很棒的文章。基本上,正则表达式是“难”的!他们会制造新的问题。然而,它们是有效的。

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

我觉得"有争议"这个词不太合适。

但我见过无数的例子,人们会问“我需要什么正则表达式来做这样那样的字符串操作?”这是X-Y问题。

换句话说,他们从假设regex是他们需要的开始,但是他们最好使用split(),一个像perl的tr///那样的转换,其中字符被一个替换为另一个,或者只是一个index()。