经过一些研究后,我发现使用正则表达式解析递归结构(如HTML或XML)是不可能的。是否有可能全面列出我应该避免使用正则表达式的日常编码场景,因为使用正则表达式执行该特定任务是不可能的?让我们说有问题的正则表达式引擎不是PCRE。
答案 0 :(得分:27)
在以下情况下不要使用正则表达式:
使用正则表达式解析HTML和XML通常都是一个坏主意,因为它们不是常规语言,并且因为已经存在可以为您解析它的库。
作为另一个例子,如果你需要检查一个整数是否在0-255范围内,如果你使用你的语言的库函数将它解析为一个整数然后检查它的数值而不是尝试编写与此范围匹配的正则表达式。
答案 1 :(得分:7)
我会在我的博文When to use and when not to use regular expressions ...
中剽窃自己公共网站不应允许用户输入正则表达式进行搜索。为网站的搜索引擎向公众提供正则表达式的全部功能可能会产生破坏性影响。应该不惜一切代价避免regular expression denial of service(ReDoS)攻击。
不应使用正则表达式进行HTML / XML解析。首先,正则表达式旨在解析regular language中Chomsky hierarchy中最简单的Linq to XML。现在,随着在正则表达式的.NET风格中平衡组定义的出现,您可以冒险进入稍微复杂的领域,并在受控情况下使用XML或HTML做一些事情。但是,没有多大意义。 XML和HTML都有可用的解析器,可以更轻松,更高效,更可靠地完成工作。在.NET中,XML可以使用旧的XmlDocument方式处理,甚至可以使用HTML Agility Pack更轻松地处理。或者对于HTML,有{{3}}。
<强>结论强>
正则表达式有其用途。我仍然认为,在许多情况下,他们可以为程序员节省大量的时间和精力。当然,给予无限时间&amp;资源,人们几乎总能构建一个程序解决方案,它比同等的正则表达式更有效。
你放弃正则表达式的决定应基于3件事:
1。)正则表达式在您的场景中是如此之慢,以至于它已成为瓶颈?
2。)你的程序解决方案实际上是否更快&amp;比正则表达式更容易写?
3。)是否有专门的解析器可以更好地完成工作?
答案 2 :(得分:2)
我的经验法则是,在没有其他解决方案时使用正则表达式。如果已经有一个解析器(例如,XML,HTML),或者您只是在寻找字符串而不是模式,那么就不需要使用正则表达式。
总是问自己“我可以在不使用正则表达式的情况下解决这个问题吗?”。该问题的答案将告诉您是否应该使用正则表达式。