正则表达式性能优化方法(高效正则表达式书写)

 更新时间:2016年06月05日 01:08:59   投稿:mdxy-dxy  
这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式

这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式,详细可以参考:正则表达式匹配解析过程探讨分析(正则表达式匹配原理)。从上面例子,我们可以推断出,影响NFA类正则表达式(常见语言:GNU Emacs,Java,ergp,less,more,.NET语言,
PCRE library,Perl,PHP,Python,Ruby,sed,vi )其实主要是它的“回溯”,减少“回溯”次数(减少循环查找同一个字符次数),是提高性能的主要方法。 我们来看个例子:

源字符串:<script type="text/javascript">adsfadfsdasfsdafdsfsadfsa</script>

匹配要求,匹配<script….>….</script>标签里面所有内容,包括改标签

常见写法(1),因为<script后面可能出现字符、空白、特殊符号等,还有标签里面也可能出现各种js代码。我们简单方法是:

正则表达式:<script.*?>.*?</script> (测试工具使用了:regexBuddy)

总共花费115步,回溯了:48次。 因为我们使用”.”字符,匹配默认情况下除了\n之外所有字符。
方法(2),我们分析特点发现,<script…>后面,应该是除了”>”之外都可以字符,然后一对<script>标签里面js内容。可以定义为除了”<”之外。(这里面我只是举例说明优化方法,实际网页中script标签里面,常见都会出现有”<”字符了)

正则表达式:<script[^?>]+>[^<]+</script>

19步,0次回溯! ,步骤只有原先的15%左右,性能几倍的提升了!
从上面我们看到,不同正则表达式,对通用字符配平,性能相差会很大。减少“回溯”是最好的方法,减少回溯其中最主要的方法是:”用最小范围的元字符,尽量避免用过大的元字符!”。一般规律如下:

1、使用正确的边界匹配器(^、$、\b、\B等),限定搜索字符串位置
2、使用具体的元字符、字符类(\d、\w、\s等) ,少用”.”字符
3、使用正确的量词(+、*、?、{n,m}),如果能够限定长度,匹配最佳
4、使用非捕获组、原子组,减少没有必要的字匹配捕获用(?:)

如:我想匹配一些英文字母,它后面接的是数字。如:abc1234,我可以写 “\w+\d+”,也可以写”[a-zA-Z]+\d+” ,其中第一个\w+会先匹配所有abc1234,然后回溯,匹配满足\d+格式。一共4步,而后面这个只需要2步,步骤减少一半了!好了,今天就先到这里,欢迎大家讨论、交流!

相关文章

  • javascript正则表达式基础篇

    javascript正则表达式基础篇

    这篇文章主要是介绍javascript正则表达式的一些基础知识,主要是介绍javascript的正则书写方法与常用实例,需要的朋友可以参考下
    2013-02-02
  • 能说明一下GETROWS的用法吗?

    能说明一下GETROWS的用法吗?

    能说明一下GETROWS的用法吗?...
    2006-06-06
  • js正则表达式之search方法讲解

    js正则表达式之search方法讲解

    返回与正则表达式查找内容匹配的第一个子字符串的位置
    2012-10-10
  • EditPlus 正则替换图片ubb替换成img

    EditPlus 正则替换图片ubb替换成img

    EditPlus 正则替换图片ubb替换成img...
    2007-04-04
  • 过滤所有HTML代码和CSS,JS

    过滤所有HTML代码和CSS,JS

    过滤所有HTML代码和CSS,JS...
    2006-08-08
  • 常用的正则表达式集锦

    常用的正则表达式集锦

    今天我将分别用PHP和Javascript向大家介绍WEB开发中最常用最实用的正则表达式及其用法,正则表达式是一门学科,不可能使用一篇文章来讲解完,理论的东西网上很多,有兴趣的同学可以搜一大把。
    2014-09-09
  • Java/Js下使用正则表达式匹配嵌套Html标签

    Java/Js下使用正则表达式匹配嵌套Html标签

    以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题(使用正则表达式匹配嵌套Html标签),但是里头用到了平衡组这样的高级特性,貌似只有DotNet还有Perl正则引擎支持,因此通用性不高。
    2010-08-08
  • Java中使用正则表达式处理文本数据

    Java中使用正则表达式处理文本数据

    正则表达式就是一个字符串,但和普通的字符串不同的是,正则表达式是对一组相似字符串的抽象。本文将给大家介绍java中使用正则表达式处理文本数据的相关的资料,感兴趣的朋友一起看看吧
    2015-10-10
  • 匹配中文汉字的正则表达式介绍

    匹配中文汉字的正则表达式介绍

    这篇文章主要介绍了匹配中文汉字的正则表达式介绍,本文同时讲解了匹配中文字符的正则和匹配双字节字符的正则,需要的朋友可以参考下
    2015-04-04
  • 十分钟上手正则表达式 下篇

    十分钟上手正则表达式 下篇

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等
    2021-10-10

最新评论