正则表达式的优化 在Jeffrey E. F. Friedl 的<<精通正则表达式>>中提到了几种技巧。今天着重说一种比较实用的。
比较简单的:
在类似 .* 或者 [\s\S]*中匹配的时候,量词* 默认是贪婪的,启用最大匹配模式, 会匹配到尽量多的字符串,如果我们的需求是匹配<b>text</b>中的text,这样就不适用了。具体来说,我们假设这个正则表达式是: <b>.*</b>但是如果目标字符串很长 <b>text</b>ssssssssssss....(此处省略100000个s) 这样就很悲催,.* 会匹配<b>后面所有的字符串,也就是 100000+ 的字符串,然后一个一个回朔,回朔100000多次之后才正确匹配</b>
很显然这种量词最大匹配的模式效率很差,当然字符串小的话无所谓,可以用?号开启最小匹配模式。优化后的表达式是 <b>.*?</b> , 让*号默认从小的开始,就是匹配一个字符之后,将后面的跟</b>进行对比。这样4次比较就哦了。
稍微复杂点的:
在书中,提炼出了一种匹配的通用模式
normal*(specail normal*) 咋一看不知道什么意思,简单的说 就是让normail尽量多的匹配正常的文本,然后摘出需要特殊处理的字符,增加对非常规字符的处理。我们举一个例子来说明这种问题。
还是匹配<b>text</b> 一般的,严格一点,我们使用 <b>(?!</?b>.)*</b>来匹配只要中间不出现<b>或者</b>都认为结束了,但是这是一个串匹配的过程,效率还不是最优的。
用通用模式来实现可以写成:
<b> #匹配开头的<b>
(?>[^<]*) #匹配任意数量的normal
(?> #固化分组
(?!</?b>) #锚定不是需要标签的字符
< #特殊字符
[^<]* #匹配任意数量的normal
)* #
</b> #匹配尾部的</b>
这种模式的核心思想视永不回朔,永远向前匹配,技巧性很强,你得先分析出什么字符可以作为specail的,在本例中,使用了< 字符,应为</b>的第一个字符就是 < , 把中间的内容都跟<比, 中间内容可能含有<a><html>诸如此类的内容, 要把<a>跟</b>区分开来,使用了锚定,相当于在有< 的时候做下判断,是单字符比较,速度较快。
相关推荐
本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者...
《精通正则表达式》是系统学习正则表达式的唯一最权威著作。任何时候,任何地方,只要提到正则表达式著作,人们都会提到这本书。该书质量之高,声誉之盛,使得几乎没有人企图挑战它的地位,从而在正则表达式图书领域...
本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的...
《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了在Perl、Java、.NET、PHP中正则表达式的用法。 《精通正则表达式(第3版)》自第1版开始着力于...
《精通正则表达式(第3版)》讲解正则表达式,这种工具能够提高工作效率、让生活变得更轻松。精心调校后的正则表达式只需要十多秒就能完成以前数小时才能完成的枯燥任务。如今,正则表达式已经成为众多语言及工具——...
本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者...
本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、 Java、.NET、PHP中的用法。 本书自第1版开始着力于教会读者“以正则表达式来思考”,来让读者...
本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者...
本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。, 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者...
正则表达式的介绍有很多,各种语言之间可能有些差异,这个是专门介绍C++正则表达式编程
本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者...
《精通正则表达式(第3版)》,以明晰轻松的笔调向程序员深入浅出地讲解复杂的知识,并给出了现实世界中复杂问题的解决办法,读者能够立刻运用书中丰富的知识,巧妙而高效地解决各种问题。 “如果你的工作需要用到...
优化正则表达式本身... 247 提高表达式速度的诀窍... 252 常识性优化... 254 将文字文本独立出来... 255 将锚点独立出来... 256 忽略优先还是匹配优先?具体情况具体分析... 256 拆分正则表达式... 257 模拟...
这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式,详细可以参考:正则表达式匹配解析过程探讨分析(正则表达式匹配原理)。从上面例子,我们可以推断出,影响NFA类正则表达式(常见语言:GNU Emacs,...
《精通正则表达式(第3版)》是正则这一万妙...《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在perl、java、.net、php中的用法。
《精通正则表达式(第3版)》随着互联网的... 《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在perl、java、.net、php中的用法。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emecs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再...
随着互联网的迅速发展,几乎所有工具软件和...《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在perl、java、.net、php中的用法。
考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2...