当前位置: 首页 > 图文教程 > 网络编程 > 正则表达式 > 正则基础之 小数点

正则表达式
[原创]正则匹配后面非指定字符的正则
一个关于正则表达式的问题
代替正则:HyperScriptExpression联合开发倡议公告
[原创]正则替换字符串功能
[原创]java 正则表达式基础,实例学习资料收集大全
web标准知识:丰富段落里的标签
js判断是否有6个连续数字的字符串的正则
正则表达式中的反向预搜索实现
精通 JavaScript中的正则表达式手机整理 推荐
取图片路径的正则
UBB 转换函数演示 (经典论坛)
pjblog的ubbcodeasp文件
PBlog2 公用JS代码
用的ubb转换
密码强度检测函数(正则)
正则表达式工具 Match Tracer
编写采集规则的好帮手—RegexBuddy 下载,正则不再难
正则表达式30分钟入门教程 v2.1版
asp 图片正则 替换,替换前检查图片是不是本地地址的方法
正则表达式口诀 正则表达式学习工具

正则表达式 中的 正则基础之 小数点


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 38 ::
收藏到网摘: n/a

小数点可以匹配除了换行符“\n”以外的任意一个字符,如要匹配小数点本身,用“\”进行转义“\.”。 一些细节
对于使用传统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>
正则表达式二:(?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">

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

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