b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

精通正则表达式_精通正则表达式 第4版_精通正则表达式 mobi(4)

电脑杂谈  发布时间:2016-12-07 20:03:09  来源:网络整理

例子:

            var reg1=/(:|\w)*/;
            var reg2=/(\w|:)*/;
            var result1=reg1.exec("ab13_b:bbbb:c34d");
            var result2=reg2.exec("ab13_b:bbbb:c34d");
            document.write(result1+" "+result2);

3.2无法匹配时

对于无法匹配的文本,可能它在匹配过程中任然会进行许多次工作,我们可以通过某种方式提高报错的速度。如使用`”.*”!`和`”[^”]*”!`去匹配字符串“The name “McDonald’s” is said “makudonarudo” in Japanese”。我们可以看出第一种回溯的次数明显多于第二种。

3.3多选结构代价高

多选结构是回溯的主要原因之一。例如使用`u|v|w|x|y|z`和`[uvwxyz]`去匹配字符串“The name “McDonald’s” is said “makudonarudo” in Japanese”。最终`[uvwxyz]`只需要34次尝试就能够成功,而如果使用`u|v|w|x|y|z`则需要在每个位置进行6次回溯,在得到同样结果前总共有206次回溯。

少用多选结构。

3.4消除无必要的括号

如果某种实现方式认为`(?:.)*`与`.*`是完全等价的,那么请使用后者替换前者,`.*`实际上更快一些。

3.5消除不需要的字符组

只包含单个字符的字符组有点多余,因为它要按照字符组来处理,而这么做完全没有必要。所以例如`[.]`可以写成`\.`。

3.6量词等价转换

有人习惯用`\d\d\d\d`,也有人习惯使用量词`\d{4}`。对于NFA来说效率上时有差别的,但工具不同结果也不同。如果对量词做了优化,则`\d{4}`会更快一些,除非未使用量词的正则表达式能够进行更多的优化。

3.7使用非捕获型括号

如果不需要引用括号内的文本,请使用非捕获型括号`(?:)`。这样不但能够节省捕获的时间,而且会减少回溯使用的状态的数量。由于捕获需要使用内存,所以也减少了内存的占用。

3.8提取必须的元素

由于很多正则引擎存在着局部优化,主要是依靠正则引擎的能力来识别出匹配成功必须的一些文本,所以我们手动的将这些文本“暴露”出来可以提高引擎识别的可能性。 `xx*`替代`x+`能够暴露必须的‘x’。`-{2,4}`可以写作`--{0,2}`。用`th(?:is|at)`代替`(?:this|that)`就能暴露必须的`th`。

3.9忽略优先和匹配优先

通常,使用忽略优先量词还是匹配优先量词取决于正则表达式的具体需求。例如`^.*:`完全不同于`^.*?:`,因为前者匹配到最后的冒号,而后者匹配到第一个冒号。但是如果目标数据中只包含一个冒号,两个表达式就没有区别了。不过并不是任何时候优劣都如此分明,大的原则是:如果目标字符串很长,而你认为冒号会比较接近字符串的开头,就使用忽略优先量词;如果你认为冒号在接近字符串的末尾位置,你就使用匹配优先。如果数据是随机的,又不知道冒号在哪头,就使用匹配优先量词,因为它们的优化一般来说都要比其他量词要好一些。

3.10拆分正则表达式

有时候,应用多个小正则表达式的速度比一个大正则表达式要快得多。比如你希望检查一个长字符串中是否包含月份的名字,依次检查`January`、`February`、`March`之类的速度要比`January|..|….`快得多。

还有很多优化的方法见《精通正则表达式》,我在这里只是列举了部分容易理解的方式。其实只要理解正则引擎室如何匹配的,理解回溯的逻辑,你就可以对自己写的表达式进行相应的优化了!


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-22527-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    每日福利
    热点图片
    拼命载入中...