我应该避免正则表达式吗?

jer*_*oft 20 regex

我认识的人一直在告诉我应该避免RegEx,因为它是重量级的或者涉及繁重的处理.这是真的?这让我耳边鼓掌,直到现在我的耳膜响了起来.

我不知道为什么他告诉我.它可能来自经验还是仅仅是三手资料(你知道我的意思......)?

所以,明白地说,我为什么要避免使用正则表达式?

我希望SO社区的主人提供信息,与我分享他们的想法.多谢你们!

Sho*_*og9 26

不要避免它们.它们是一个很好的工具,如果使用得当,可以节省大量的时间和精力.此外,仔细使用的良好实现不应特别占用CPU.

  • 对.如果你在过去的二十年中一直在编写解析器,那么现在你可以在几分钟内写出一个完美的"长手"等同于任何正则表达式(一只手臂绑在背后,蒙着眼睛......)然后一定要,不要打扰他们.但对于我们大多数人来说,编写正则表达式比编写等效的解析代码要快,即使我们必须在这样做时查找语法!甚至一个中等复杂的表达式比两页嵌套的switch语句更容易理解...... (9认同)
  • @ Shog9:感谢您对已删除的副本的提醒.我认为这个问题的措辞是它的垮台.答案绝对值得打捞,所以我把它们合并了. (2认同)

Guf*_*ffa 22

如果您可以使用常见的字符串操作轻松执行相同的操作,则应避免使用正则表达式.

在大多数情况下,使用正则表达式,其中相同的操作需要大量的常见字符串操作,然后当然没有必要避免使用正则表达式.

  • 听起来像常识,但人们似乎忘记了这一点. (3认同)
  • "常识并不常见" - 伏尔泰;) (2认同)

cle*_*tus 18

言过其实?不,他们非常强大和灵活.

过度使用?绝对.特别是在解析HTML时(经常出现在这里).

这是另一个"适合工作的工具"场景.有些人走得太远,并尝试将它用于一切.

你是对的,因为你可以用子串和/或拆分做很多事情.你会经常达到一个目的,那些你正在做的事情会变得如此复杂以至于你必须改变方法,或者你最终写出了太多脆弱的代码.正则表达式(相对)易于扩展.

但手写代码几乎总是更快.一个很好的例子是将char放入每个N个字符的java字符串中.正则表达式解决方案更简洁,但有一些问题,手写循环没有,而且速度慢得多.

  • 编译(写得好)的正则表达式实际上往往非常快.它只是一个状态机.我认为很多速度问题可以归结为人们不理解将正则表达式的字符串表示转换为编译的正则表达式会有相当大的代价. (3认同)

Jan*_*rts 12

您可以使用几乎任何技术替换您的问题中的"正则表达式",并且您会发现那些对该技术了解不足或者懒得学习制造此类声明的技术的人.

关于正则表达式没有什么重要的.程序员使用正则表达式让自己陷入麻烦的最常见方式是他们尝试使用单个正则表达式做太多.如果您使用正则表达式来实现它们的目的(简单模式匹配),那么您将很难编写比等效正则表达式更高效的过程代码.鉴于对正则表达式的熟练程度,正则表达式编写时间更短,更易于阅读,并且可以粘贴到RegexBuddy等工具中进行可视化.


use*_*878 8

作为基本的解析器或验证器,使用正则表达式,除非您编写的解析或验证代码更容易阅读.

对于复杂的解析器(即递归下降解析器),仅使用正则表达式来验证词法元素,而不是查找它们.

最重要的是,最好的正则表达式引擎可以很好地调整验证工作,在某些情况下可能比你自己编写的代码更有效,而在其他情况下,你的代码会表现得更好.根据您的需要使用手写状态机或正则表达式编写代码,但如果性能测试显示正则表达式效率非常低,则可以从正则表达式更改为手写代码.

  • +1表示正则表达式通常不是复杂解析器的正确解决方案 (2认同)

Pau*_*ier 7

"当你拿锤子时,一切看起来都像钉子."

正则表达式是一个非常有用的工具; 但我同意他们使用的每一个地方都没有必要.对他们来说,一个积极的因素是,因为它们往往很复杂并且在它们所处的地方使用得非常多,所以应用正则表达式的算法往往会得到很好的优化.也就是说,学习正则表达式所涉及的开销可能很高.很高.

正则表达式是适用于所有适用情况的最佳工具吗?可能不是,但另一方面,如果你一直使用字符串验证和搜索,你可能会使用正则表达式; 一旦你这样做,你已经掌握了使用该工具所需的知识,可能比任何其他工具更有效,更快捷.但是,如果您没有这种经验,那么学习它实际上会拖累您的实施效率.所以我认为这取决于你愿意投入学习新范式的时间,以及你项目中涉及的匆忙程度.总的来说,我认为正则表达式非常值得学习,但与此同时,坦诚地说,学习过程可能很糟糕.


dic*_*oce 5

我认为,如果你学习的语言本能地说正则表达式,你会倾向于他们,因为他们只是解决了很多问题.IE,你可能永远都不会学习使用split,因为regexec()可以解决更广泛的问题,一旦你习惯了它,为什么要在其他地方看?

另一方面,我敢打赌C和C++程序员将首先考虑其他选项,因为它没有内置到语言中.


dr *_*ter 5

你知道,鉴于我是许多人所说的"年轻",我听到过太多关于RegEx的批评.你知道,"他有一个问题,并试图使用正则表达式,现在他有两个问题".

说真的,我不明白.它是一个像其他任何工具一样的工具 如果您需要一个包含一些文本的简单网站,则不需要PHP/ASP.NET/STG44.仍然没有讨论是否应该避免任何这些问题.有多奇怪

根据我的经验,RegEx可能是我作为开发人员遇到过的最有用的工具.对于#1安全问题,它是最有用的工具:解析用户输入.如果不是几天的编码和创建潜在的错误(读取:糟糕的)代码,我已经节省了我几个小时.

使用现代CPU,我看不到这里的性能问题.我非常愿意为了一些质量和安全而牺牲一些周期.(但情况并非总是如此,但我认为这些情况很少见.)

RegEx仍然非常强大.拥有权利的同时也被赋予了重大的责任.这并不意味着你可以随时使用它.只有它的力量值得使用.

正如上面提到的那样,使用RegEx进行HTML解析就像是装满枪的俄罗斯轮盘.不要做任何事情,包括RegEx.

  • +1和阿门.当然你不使用简单字符串替换的正则表达式,但任何无法理解正则表达式的程序员都不是正确的职业,它们并不容易,但它们只是*不**那个*很难. (2认同)

Mar*_*fuß 5

您还应该不惜一切代价避免使用浮点数。那就是当您在嵌入式环境中编程时。

说真的:如果您正在进行正常的软件开发,如果您需要做一些无法通过更简单的字符串操作实现的事情,那么您实际上应该使用正则表达式。我想说,任何普通程序员都无法以比相应正则表达式更快的方式实现最好使用正则表达式完成的事情。编译后,正则表达式将作为状态机工作,并被优化到近乎完美。