这里提到的正则表达式优化主要是针对目前常用的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步,步骤减少一半!好了,今天就到这里。欢迎大家讨论交流!