何时不在C#中使用Regex(或Java,C ++等)

时间:2009-06-09 08:45:43

标签: c# java regex

很明显,有很多问题看起来像一个简单的正则表达式解决方案,但用正则表达式来解决这个问题非常困难

那么不是正则表达式专家的人如何知道他/她是否应该学习正则表达式以解决特定问题?

(请参阅"Regex to parse C# source code to find all strings"了解我提出此问题的方式。)

这似乎总结得很好:

  

Some people, when confronted with a problem, think “I know, I'll use   regular expressions.” Now they have two problems...

(我刚刚更改了问题的标题以使其更具体,因为在C#中使用Regex的一些问题在Perl和JScript中得到解决,例如,两个引用级别使Regex难以理解的事实。)

7 个答案:

答案 0 :(得分:14)

不要试图使用正则表达式来解析分层文本,如程序源(或嵌套的XML):它们被证明不够强大,例如,对于一串parens,它们不能解决他们是否平衡。

使用解析器生成器(或类似技术)。

另外,我不建议使用正则表达式来验证具有严格正式标准的数据,例如电子邮件地址。 他们比你想要的更难,你要么是不准确的,要么是非常长的正则表达式。

答案 1 :(得分:4)

有两个方面需要考虑:

  • 能力:您尝试识别Type-3语言(常规语言)的语言是什么?如果是这样,那么你可以使用正则表达式,如果没有,你需要一个更强大的工具。

  • 可维护性:如果编写,测试和理解正则表达式需要花费更多时间而不是程序化对应物,那么这是不合适的。如何检查这一点很复杂,我建议与你的同伴一起进行同行评审(如果他们在看到它时说“什么......”,那就太复杂了)或者只是让它没有记录几天然后拿一个自己看看并衡量理解它需要多长时间。

答案 2 :(得分:1)

我是初学者,当涉及到正则表达式,但恕我直言,花一些时间学习基本的正则表达式是值得的,你会意识到你已经解决的许多很多问题可能(也许应该)使用正则表达式。

对于特定问题,请尝试在regexlib等网站上找到解决方案,看看您是否能够理解解决方案。

如上所述,正则表达式可能不足以解决特定问题,但浏览浏览像regexlib这样的网站肯定会告诉您正则表达式是否是解决问题的正确方法。

答案 3 :(得分:0)

你应该总是学习正则表达式 - 只有这样你才能判断何时使用它们。通常,当您需要非常好的性能时,它们会出现问题。但是,使用正则表达式通常要比编写一个大的switch语句容易得多。

看一下this question - 它会向你展示正则表达式的优雅,与类似的if()结构形成鲜明对比......

答案 4 :(得分:0)

使用正则表达式识别文本中的(常规)模式。不要将它用于将文本解析为数据结构。当表达式变得非常大时,不要使用正则表达式。

通常不清楚何时不使用正则表达式。例如,您不应使用正则表达式进行正确的电子邮件地址验证。起初看起来很简单,但有效电子邮件地址的规范并不像您想象的那样规律。您可以使用正则表达式初始搜索电子邮件地址候选者。但是你需要一个解析器来实际验证候选地址是否符合给定的标准。

答案 5 :(得分:0)

至少,我会说学习正则表达式只是为了让你完全理解它们,并能够在它们工作的情况下应用它们。在我的脑海中,我会使用正则表达式:

  • 识别字符串的各个部分。
  • 检查字符串是否符合某种格式或结构。
  • 查找与特定模式匹配的子字符串。
  • 将符合特定模式的字符串转换为不同的形式(搜索替换,大写等)。

理论层面的正则表达形成了状态机的基础 - 在计算机科学中,你有确定性有限自动机(DFA)和非确定性有限自动机(NFA)。您可以使用正则表达式对输入强制执行某种验证 - 正则表达式引擎只是将正则表达式模式/字符串解释或转换为实际的运行时操作。

一旦您知道要确定有效的字符串(或数据)是否可以由DFA进行测试,您就可以选择是使用自己的代码还是使用正则表达式引擎自行实现该DFA。您会发现了解正则表达式实际上会增强您的工具箱以及您对字符串处理实际上如何变得复杂的理解。

基于简单的正则表达式,您可以了解有关解析器以及解析器如何工作的知识。在最低级别,您正在查看词法分析(正则表达式在其中工作)以及更高级别的语法和语义动作。这些是编译器和解释器工作的基础,以及协议解析器实现,以及文档呈现/转换应用程序依赖。

答案 6 :(得分:0)

这里主要关注的是可维护性。

对我来说很明显,任何值得他的程序员必须知道正则表达式。不知道它们就像是,不知道抽象和封装是什么,只是,可能更糟。所以这是不可能的。

另一方面,人们应该考虑,即使对于那些真正擅长于他们的人来说,维护正则表达式驱动的代码(用任何语言编写)也可能是一场噩梦。因此,在我看来,这里正确的方法是只在不可避免的情况下使用它们,并且使用正则表达式的代码比非正则表达式变体更易读。当然,正如已经指出的那样,不要将它们用于某些东西,它们并不意味着它们(如xml)。并且没有电子邮件地址验证(我的一个烦恼:P)!

但是说真的,当你将所有 substr 用于某些东西时,感觉不是很糟糕,可以用一些字符解决,看起来像线路噪音?我知道这对我有用。