专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 正则表达式小数点:正则基础的 小数点 »正文

正则表达式小数点:正则基础的 小数点

来源: 发布时间:星期一, 2009年9月7日 浏览:66次 评论:0
些细节
对于使用传统NFA引擎大多数语言和工具如Java、.NET来说“.”匹配范围是匹配除了换行符“\n”以外任意
但是对于javascript来说有些特殊由于各浏览器解析引擎区别“.”匹配范围也有所区别对于Trident内核浏览器如IE来说“.”同样是匹配除了换行符“\n”以外任意但是对于其它内核浏览器如Firefox、Opera、Chrome来说“.”是匹配除了回车符“\r”和换行符“\n”以外任意
有关此细节些猜测
复制代码 代码如下:

# <script type="text/javascript">
# document.write(/./.test("\r") + "<br />");
# document.write(/./.test("\n") + "<br />");
# </script>
# //IE下输出
# true
# false
# //Firefox、Opera、Chrome下输出
# false
# false


大概测了Trident、Presto和Gecko应该都是采用传统NFA引擎而webkit至少是支持传统NFA引擎但是又和传统NFA引擎表现不太估计不是做了高级优化传统NFA引擎就是DFA/NFA混合引擎
由于Windows下支持“\r”和“\n”而UNIX下只支持“\n”所以我猜想可能是由于其它浏览器引擎并不来自于Windows所以没有提供对“\r”支持从而导致在正则中“.”也不匹配“\r”吧没做深入研究只是些猜测罢了
常见应用误区 注意
在匹配多行时不要试图用“[.\n]”来匹配任意这种写法表示只是小数点和换行符两个可以使用“(.|\n)”般不这样用这样写可读性差效率也低般用“[\s\S]”或者是用“.”加(?s)匹配模式来达到这效果
举例
需求描述:匹配<td>标签中内容
串:<td>This is a test line.
Another line. </td>
匹配结果:<td>This is a test line.
Another line. </td>
正则表达式:<td>[\s\S]*</td>
正则表达式 2:(?s)<td>.*</td>
匹配效率测试
以下为测试用即下面richTextBox1.Text里输入内容(取自CSDN首页):
复制代码 代码如下:

<link href="images/favicon.ico" rel="SHORTCUT ICON" />
<title>CSDN.NET - 中国领先IT技术社区为IT专业技术人员提供最全面信息传播和服务平台</title>
<script language='JavaScript' type='text/javascript' src='http://www.csdn.net/ggmm/csdn_ggmm.js'></script> <script type="text/javascript" src="http://counter.csdn.net/a/js/AreaCounter.js%22%3E%3C/script>
<script type="text/javascript">


测试代码:
复制代码 代码如下:

# yourStr = richTextBox1.Text;
# StringBuilder src = StringBuilder(4096);
# for ( i = 0; i < 10000; i)
# {
# src.Append(yourStr);
# }
# strData = src.;
# List<Regex> reg = List<Regex>;
# reg.Add( Regex(@"[\s\S]"));
# reg.Add( Regex(@"[\w\W]"));
# reg.Add( Regex(@"[\d\D]"));
# reg.Add( Regex(@"(.|\n)"));
# reg.Add( Regex(@"(?s)."));
# test = .Empty;
# Stopwatch stopW = Stopwatch;
# foreach (Regex re in reg)
# {
# stopW.Re;
# stopW.Start;
# test = strData;
# test = re.Replace(test, "");
# stopW.Stop;
# richTextBox2.Text "正则表达式:" + re..PadRight(10) + "执行时间:" + stopW.ElapsedMilliseconds. + " ms";
# richTextBox2.Text "\n---------------------------------------\n";
# }


测试结果:
测试分两组进行执行前内存占用为921M
组是未使用量词每次仅替换执行时间如下占用内存938M
复制代码 代码如下:

正则表达式:[\s\S] 执行时间:2651 ms
---------------------------------------
正则表达式:[\w\W] 执行时间:2515 ms
---------------------------------------
正则表达式:[\d\D] 执行时间:2187 ms
---------------------------------------
正则表达式:(.|\n) 执行时间:2470 ms
---------------------------------------
正则表达式:(?s). 执行时间:1969 ms


组使用了量词次替换所有执行时间如下占用内存1128M
复制代码 代码如下:

测试结果(带量词)
正则表达式:[\s\S]+ 执行时间:249 ms
---------------------------------------
正则表达式:[\w\W]+ 执行时间:348 ms
---------------------------------------
正则表达式:[\d\D]+ 执行时间:198 ms
---------------------------------------
正则表达式:(.|\n)+ 执行时间:879 ms
---------------------------------------
正则表达式:(?s).+ 执行时间:113 ms
---------------------------------------


测试结果分析:
匹配效率最高是采用了Singleline这种匹配模式“.”
其次是“[\d\D]”而“(.|\n)”匹配效率最低
“[\s\S]”匹配效率居中只是习惯上用得多些
注:由于各语言支持引擎区别即使使用同种引擎对正则做优化也有所区别所以以上性能测试结论可能仅适用于.NET
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: