在探索正则表达式(也称为正则表达式)时,有许多人似乎将正则表达式视为圣杯。看起来如此复杂的东西——一定是任何问题的答案。他们倾向于认为每个问题都可以用正则表达式解决。
另一方面,也有很多人不惜一切代价试图避免正则表达式。他们试图找到一种绕过正则表达式的方法,并仅仅为了它而接受额外的编码,即使正则表达式将是一个更紧凑的解决方案。
为什么正则表达式被认为如此有争议?关于它们的工作原理是否存在广泛的误解?或者正则表达式通常比较慢是一种普遍的看法?
在探索正则表达式(也称为正则表达式)时,有许多人似乎将正则表达式视为圣杯。看起来如此复杂的东西——一定是任何问题的答案。他们倾向于认为每个问题都可以用正则表达式解决。
另一方面,也有很多人不惜一切代价试图避免正则表达式。他们试图找到一种绕过正则表达式的方法,并仅仅为了它而接受额外的编码,即使正则表达式将是一个更紧凑的解决方案。
为什么正则表达式被认为如此有争议?关于它们的工作原理是否存在广泛的误解?或者正则表达式通常比较慢是一种普遍的看法?
当前回答
regex的最佳有效和正常用法是用于电子邮件地址格式验证。
这是一个很好的应用。
我曾经无数次在TextPad中一次性使用正则表达式来编辑平面文件、创建csv文件、创建SQL插入语句等等。
写得好的正则表达式不应该太慢。通常替代选项,比如大量的Replace调用,都是非常慢的选项。还不如一口气搞定。
许多情况只需要正则表达式,而不需要其他任何东西。
用无害字符替换特殊的非打印字符是另一种很好的用法。
我当然可以想象,有一些代码库过度使用正则表达式,从而损害了可维护性。我自己从来没见过。实际上,我因为没有充分使用正则表达式而被代码评审员避而远之。
其他回答
在lex和yacc中用于编译器定义的正则表达式系统是很好的、非常有用和干净的。在这些系统中,表达式类型是根据其他表达式类型定义的。在perl和sed代码(等等)中常见的丑陋的畸形的不可读的行噪声巨型一行正则表达式是“有争议的”(垃圾)。
regex的最佳有效和正常用法是用于电子邮件地址格式验证。
这是一个很好的应用。
我曾经无数次在TextPad中一次性使用正则表达式来编辑平面文件、创建csv文件、创建SQL插入语句等等。
写得好的正则表达式不应该太慢。通常替代选项,比如大量的Replace调用,都是非常慢的选项。还不如一口气搞定。
许多情况只需要正则表达式,而不需要其他任何东西。
用无害字符替换特殊的非打印字符是另一种很好的用法。
我当然可以想象,有一些代码库过度使用正则表达式,从而损害了可维护性。我自己从来没见过。实际上,我因为没有充分使用正则表达式而被代码评审员避而远之。
你可能会问为什么goto会有争议。
基本上,当你拥有这么多“显而易见”的权力时,人们倾向于在它们不是最佳选择的情况下滥用它们。例如,要求用正则表达式解析csv或XML或HTML的人的数量让我感到震惊。这不是做这项工作的合适工具。但是一些用户还是坚持使用正则表达式。
就我个人而言,我试图找到一个中庸之道——在正则表达式擅长的地方使用它们,在它们不是最优的时候避免使用它们。
请注意,正则表达式仍然可以用于解析csv、XML、HTML等。但通常不是在一个正则表达式中。
人们倾向于认为正则表达式很难;但那是因为他们用错了。在没有任何注释、缩进或命名捕获的情况下编写复杂的一行程序。(你不会把复杂的SQL表达式塞进一行,没有注释、缩进或别名,对吧?)所以,是的,对很多人来说,它们没有意义。
然而,如果你的工作与文本解析有关(基本上所有的web应用程序都是如此),而你不懂正则表达式,那你的工作就糟透了,你在浪费自己和雇主的时间。有很好的资源可以教你关于他们的一切,你需要知道的,甚至更多。
正则表达式对包括我自己在内的很多人来说都是一个严重的谜。这很有效,但就像看数学方程一样。我很高兴地告诉大家,有人终于在http://regexlib.com/上创建了各种正则表达式函数的统一位置。现在,如果微软只创建一个正则表达式类,它将自动完成许多常见的事情,如消除字母或过滤日期。