如果不在C#(或Java,C ++等)中使用正则expression式,
很明显,有很多问题看起来像一个简单的正则expression式可以解决,但是用正则expression式很难解决。
那么一个不是正则expression式专家的人怎么知道他/她是否应该学习正则expression式来解决一个给定的问题呢?
(请参阅“正则expression式parsingC#源代码来查找所有string”的方式,我问这个问题。)
这似乎总结得很好:
有些人遇到问题时,会想“我知道,我会用 正则expression式”,现在有两个问题…
(我刚刚更改了问题的标题,使其更具体,因为在C#中使用正则expression式的一些问题已经在Perl和JScript中解决了,例如两个引用级别使得正则expression式不可读的事实。)
不要试图用正则expression式来parsing层次化的文本,比如程序源码(或嵌套的XML):它们被certificate是不够强大的,例如,对于一系列的parens,重新平衡还是不平衡。
使用parsing器生成器(或类似的技术)。
此外,我不build议使用正则expression式来validation数据严格的正式标准,如电子邮件地址。 他们比你想要的更难,你会有不准确的或很长的正则expression式。
有两个方面需要考虑:
-
能力:是你正在尝试识别Type-3语言的语言吗? 如果是这样的话,那么你可以使用正则expression式,如果没有,你需要一个更强大的工具。
-
可维护性:如果编写,testing和理解一个正则expression式的时间比编程对应的要多,那么这是不合适的。 如何检查这个问题很复杂,我build议你和同伴们进行同行评议(如果他们看到的话会说“什么…”,那么这太复杂了),或者只是把文件留在那里几天,然后拿看看你自己,衡量多久才能理解它。
我是一个初学者,当谈到正则expression式,但恕我直言,这是值得花一些时间学习基本的正则expression式,你会意识到,许多你已经解决不同的问题可以(也许应该)使用正则expression式解决。
对于特定的问题,请尝试在regexlib等网站上find解决scheme,并查看是否可以理解该解决scheme。
如上所述,正则expression式可能不足以解决特定的问题,但浏览像regexlib这样的网站浏览器肯定会告诉你,正则expression式是否是解决您的问题的正确方法。
你应该总是学习正则expression式 – 只有这样你才能判断何时使用它们。 通常他们会遇到问题,当你需要非常好的performance。 但是使用正则expression式要比写一个大的switch语句要容易得多。
看看这个问题 – 它显示了正则expression式的优雅,与类似的if()构造相比…
使用正则expression式来识别文本中的(规则)模式。 不要用它来parsing文本到数据结构中。 当expression式变得非常大时不要使用正则expression式。
通常不用什么时候不使用正则expression式。 例如,您不应使用正则expression式进行正确的电子邮件地址validation。 起初看起来很简单,但有效的电子邮件地址规范并不像您想象的那样规范。 您可以使用正则expression式来初始search电子邮件地址候选项。 但是,您需要一个parsing器来实际validation地址候选符合给定的标准。
至less,我会说学习正则expression式,这样你就可以完全理解它们,并且能够在他们工作的情况下运用它们。 closures我的头顶,我会使用正则expression式:
- 识别string的部分。
- 检查string是否符合某种格式或结构。
- 查找匹配特定模式的子string。
- 将符合特定模式的string转换为不同的格式(searchreplace,大写等)。
在理论层面上的正则expression式构成了状态机的基础 – 在计算机科学中,有确定性有限自动机(DFA)和非确定性有限自动机(NFA)。 您可以使用正则expression式对input执行某种validation – 正则expression式引擎只是将正则expression式模式/string解释或转换为实际的运行时操作。
一旦您知道要确定的string(或数据)是否可以通过DFA进行testing,您可以select是使用自己的代码还是使用正则expression式引擎自己实现该DFA。 你会发现,了解正则expression式实际上会增强你的工具箱和你对string处理实际上如何变得复杂的理解。
基于简单的正则expression式,您可以了解parsing器以及parsing器如何工作。 在最低层次上,你正在考察词法分析(正则expression式的工作方式),而在更高层次上则是语法和语义方面的行动。 这些是编译器和解释器工作的基础,协议parsing器实现以及文档渲染/转换应用程序依赖的基础。
这里主要关心的是可维护性。
对我来说显而易见的是,任何值得他的盐的程序员都必须知道正则expression式。 不知道它们就像是不知道抽象和封装是什么,可能更糟。 所以这是不可能的。
另一方面,应该考虑到,即使对于一个真正擅长他们的人来说,维护正则expression式驱动的代码(用任何语言编写)也是一场噩梦。 所以,在我看来,这里的正确方法是在不可避免的时候才使用它们,而使用正则expression式的代码比非正则expression式更具可读性。 当然,正如已经指出的那样,不要将它们用于某些东西,而不是用来做(比如xml)。 也没有电子邮件地址validation(我的宠物peeves:P)之一!
但是,严肃地说,当你把所有这些东西用于某些东西时,是不是觉得不对,这些东西可以用一些字符来解决,看起来像线条噪音? 我知道这是为我做的。