正则表达式优化

这里说的正则表达式优化,主要是针对目前经常使用的NFA模式正则表达式,javascript

 

详细能够参考:正则表达式匹配解析过程探讨分析(正则表达式匹配原理)html

 

从上面例子,咱们能够推断出,影响NFA类正则表达式java

(常见语言:GNU Emacs,Java,ergp,less,more,.NET语言, 
PCRE library,Perl,PHP,Python,Ruby,sed,vi )正则表达式

 

其实主要是它的“回溯”,减小“回溯”次数(减小循环查找同一个字符次数),是提升性能的主要方法。 咱们来看个例子:性能优化

 

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

匹配要求,匹配<script….>….</script>标签里面全部内容,包括改标签工具

 

常见写法(1),由于<script后面可能出现字符、空白、特殊符号等,还有标签里面也可能出现各类js代码。性能

咱们简单方法是:测试

正则表达式:<script.*?> .*? </script> 优化

(测试工具使用了:regexBuddy)

 

正则表达式性能优化 
总共花费115步,回溯了:48次。 由于咱们使用”.”字符,匹配默认状况下除了\n以外全部字符。

 

方法(2),咱们分析特色发现,<script…>后面,应该是除了”>”以外均可以字符,而后一对<script>标签里面js内容。

能够定义为除了”<”以外。(这里面我只是举例说明优化方法,实际网页中script标签里面,常见都会出现有”<”字符了

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

正则表达式性能优化 
19步,0次回溯! ,步骤只有原先的15%左右,性能几倍的提高了!

 

从上面咱们看到,不一样正则表达式,对通用字符配平,性能相差会很大。

减小“回溯”是最好的方法,减小回溯其中最主要的方法是:”用最小范围的元字符,尽可能避免用过大的元字符!”。

 

通常规律以下:

一、使用正确的边界匹配器(^、$、\b、\B等),限定搜索字符串位置

二、使用具体的元字符、字符类(\d、\w、\s等) ,少用”.”字符

三、使用正确的量词(+、*、?、{n,m}),若是可以限定长度,匹配最佳

四、使用非捕获组、原子组,减小没有必要的字匹配捕获用(?:)

 

如:我想匹配一些英文字母,它后面接的是数字。

如:abc1234,我能够写 “\w+\d+”,也能够写”[a-zA-Z]+\d+” ,

其中第一个\w+会先匹配全部abc1234,而后回溯,匹配知足\d+格式

 

一共4步,然后面这个只须要2步,步骤减小一半了!好了,今天就先到这里,欢迎你们讨论、交流!

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息