宝哥软件园

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

编辑:宝哥软件园 来源:互联网 时间:2021-10-28

这里提到的正则表达式优化主要是针对目前常用的NFA模式正则表达式。详见:正则表达式匹配解析过程讨论与分析(正则表达式匹配原理)。从上面的例子中,我们可以推断出NFA正则表达式(常用语言:GNU emacs、Java、ERGP、LESS、MORE、NET语言、PCRE Library、Perl、PHP、Python、Ruby、SED、VI)其实主要是它的“回溯”,减少了“回溯”的次数(减少了循环搜索同一个字符的次数)。让我们看一个例子:

来源:脚本类型=' text/JAVAScript ' adsfadfdafsdadsfssadfsa/script。

匹配需求,匹配脚本中的所有内容……/脚本标签,包括更改标签。

常见的写法(1),因为字符、空格、特殊符号等。可能出现在脚本后面,各种js代码可能出现在标签内部。我们的简单方法是:

正则表达式:脚本。*?*?/script(测试工具使用:regexBuddy)。

一共走了115步,回溯了:48次。因为我们用“.”字符,默认情况下,它匹配除n以外的所有字符。方法(2),我们分析了特征,发现在script…之后,除了“”之外的所有字符都应该可用,然后是script标签中的一对js内容。可以定义为""以外的。(我只是举个例子来说明优化方法。在实际网页的脚本标签中,字符“”经常出现。).

正则表达式:脚本[?][^]/脚本

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步,步骤减少一半!好了,今天就到这里。欢迎大家讨论交流!

更多资讯
游戏推荐
更多+