繁体   English   中英

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

[英]When not to use Regex in C# (or Java, C++, etc.)

很明显,有很多问题看起来像一个简单的正则表达式将解决,但事实证明,使用正则表达式很难解决。

那么, 不是正则表达式专家的人怎么知道他/她是否应该学习正则表达式来解决给定的问题?

(请参阅“正则表达式解析C#源代码以查找所有字符串” ,以便我提出这个问题。)

这似乎总结得很好:

有些人在遇到问题时会想“我知道,我会使用 正则表达式。”现在他们有两个问题......

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

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

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

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

有两个方面需要考虑:

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

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

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

对于特定问题,请尝试在regexlib等站点上查找解决方案,并查看是否可以理解该解决方案。

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

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

看看这个问题 - 它展示了正则表达式的优雅,与类似的if()结构形成鲜明对比......

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

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

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

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

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

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

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

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

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

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

但是严肃地说,当你使用所有这些字符串来表示某些字符时,它是不是感觉不对,可以用一些字符解决,看起来像线路噪音? 我知道这对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM