在探索正则表达式(也称为正则表达式)时,有许多人似乎将正则表达式视为圣杯。看起来如此复杂的东西——一定是任何问题的答案。他们倾向于认为每个问题都可以用正则表达式解决。
另一方面,也有很多人不惜一切代价试图避免正则表达式。他们试图找到一种绕过正则表达式的方法,并仅仅为了它而接受额外的编码,即使正则表达式将是一个更紧凑的解决方案。
为什么正则表达式被认为如此有争议?关于它们的工作原理是否存在广泛的误解?或者正则表达式通常比较慢是一种普遍的看法?
在探索正则表达式(也称为正则表达式)时,有许多人似乎将正则表达式视为圣杯。看起来如此复杂的东西——一定是任何问题的答案。他们倾向于认为每个问题都可以用正则表达式解决。
另一方面,也有很多人不惜一切代价试图避免正则表达式。他们试图找到一种绕过正则表达式的方法,并仅仅为了它而接受额外的编码,即使正则表达式将是一个更紧凑的解决方案。
为什么正则表达式被认为如此有争议?关于它们的工作原理是否存在广泛的误解?或者正则表达式通常比较慢是一种普遍的看法?
当前回答
这是一个有趣的话题。 许多regexp爱好者似乎混淆了公式的简洁性和效率。最重要的是,一个需要大量思考的regexp会给它的作者带来巨大的满足感,使它立即变得合法。
但是…当性能不是问题,并且需要快速处理文本输出时(例如在Perl中),regexp非常方便。此外,虽然性能是一个问题,但人们可能不愿意尝试使用可能有bug或效率较低的自制算法来击败regexp库。
此外,还有许多原因导致regexp受到不公平的批评
regexp效率不高,因为构建顶部的regexp并不明显 有些程序员“忘记”只编译一次要多次使用的regexp(就像Java中的静态模式) 有些程序员采用试错策略——regexp的效果更差!
其他回答
我觉得"有争议"这个词不太合适。
但我见过无数的例子,人们会问“我需要什么正则表达式来做这样那样的字符串操作?”这是X-Y问题。
换句话说,他们从假设regex是他们需要的开始,但是他们最好使用split(),一个像perl的tr///那样的转换,其中字符被一个替换为另一个,或者只是一个index()。
正则表达式允许您以紧凑的方式编写自定义有限状态机(FSM)来处理输入字符串。为什么使用正则表达式很难,至少有两个原因:
Old-school software development involves a lot of planning, paper models, and careful thought. Regular expressions fit into this model very well, because to write an effective expression properly involves a lot of staring at it, visualizing the paths of the FSM. Modern software developers would much rather hammer out code, and use a debugger to step through execution, to see if the code is correct. Regular expressions do not support this working style very well. One "run" of a regular expression is effectively an atomic operation. It's hard to observe stepwise execution in a debugger. It's too easy to write a regular expression that accidentally accepts more input than you intend. The value of a regular expression isn't really to match valid input, it's to fail to match invalid input. Techniques to do "negative tests" for regular expressions are not very advanced, or at least not widely used. This goes to the point of regular expressions being hard to read. Just by looking at a regular expression, it takes a lot of concentration to visualize all possible inputs that should be rejected, but are mistakenly accepted. Ever try to debug someone else's regular expression code?
如果现在软件开发人员对使用正则表达式有抵触情绪,我认为主要是由于这两个因素。
我发现正则表达式有时是无价的。当我需要做一些“模糊”搜索时,可能会替换。当数据可能变化,具有一定的随机性时。 然而,当我需要做一个简单的搜索和替换,或检查字符串,我不使用正则表达式。尽管我知道很多人这样做,但他们什么都用它。这就是争议所在。
如果你想在墙上钉钉子,不要用锤子。是的,它会起作用,但等你拿到锤子,我可以在墙上钉20个钉子。
正则表达式应该用于它们设计的目的,而不是别的。
这是一个有趣的话题。 许多regexp爱好者似乎混淆了公式的简洁性和效率。最重要的是,一个需要大量思考的regexp会给它的作者带来巨大的满足感,使它立即变得合法。
但是…当性能不是问题,并且需要快速处理文本输出时(例如在Perl中),regexp非常方便。此外,虽然性能是一个问题,但人们可能不愿意尝试使用可能有bug或效率较低的自制算法来击败regexp库。
此外,还有许多原因导致regexp受到不公平的批评
regexp效率不高,因为构建顶部的regexp并不明显 有些程序员“忘记”只编译一次要多次使用的regexp(就像Java中的静态模式) 有些程序员采用试错策略——regexp的效果更差!
因为它们缺少普遍接受的ide中最流行的学习工具:没有Regex Wizard。甚至连自动补全都不行。你必须自己编写整个程序。