1、正则基础之小数点小数点可以匹配除了换行符“n”以外的任意一个字符,如要匹配小数点本身,用“”进行转义“.”。一些细节对于使用传统NFA引擎的大多数语言和工具,如Java、.NET来说,“.”的匹配范围是匹配除了换行符“n”以外的任意一个字符。但是对于javascript来说有些特殊,由于各浏览器的解析引擎不同,“.”的匹配范围也有所不同,对于Trident内核的浏览器,如IE来说,“.”同样是匹配除了换行符“n”以外的任意一个字符,但是对于其它内核的浏览器,如Firefox、Opera、Chrome来说,“.”是匹配除了回车符“r”和换行符“n”以外的任意一个字符。关于此细节的一些猜测复制代码
2、代码如下:# # document.write(/./.test(“r“) + “);# document.write(/./.test(“n“) + “);# # /IE下输出# true# false# /Firefox、Opera、Chrome下输出# false# false大概测了一下,Trident、Presto和Gecko应该都是采用的传统NFA引擎,而webkit至少是支持传统NFA引擎的,但是又与传统NFA引擎表现的不太一样,估计不是做了高级优化的传统NFA引擎,就是DFA/NFA混合引擎。由于Windows下支持“r”和“n”,而UNIX下只支持“n”,所以我猜想可能是由于
3、其它浏览器引擎并不来自于Windows,所以没有提供对“r”的支持,从而导致在正则中“.”也不匹配“r”吧。没做深入研究,只是一些猜测罢了。常见应用误区注意在匹配多行时,不要试图用“.n”来匹配任意字符,这种写法表示的只是小数点和换行符两个字符中的一个,可以使用“(.|n)”,但一般不这样用,这样写可读性差,效率也低,一般用“sS”,或者是用“.”加(?s)匹配模式来达到这一效果。举例需求描述:匹配标签中的内容源字符串:This is a test line.Another line. 匹配结果:This is a test line.Another line. 正则表达式一:sS*正则表达式
4、二:(?s).*匹配效率测试以下为测试用字符串,即下面richTextBox1 .Text里输入的内容(取自CSDN首页):复制代码代码如下:CSDN.NET -中国领先的IT技术社区,为IT专业技术人员提供最全面的信息传播和服务平台 测试代码:复制代码代码如下:# string yourStr = richTextBox1 .Text;# StringBuilder src = new StringBuilder(4 0 9 6 );# for (int i = 0 ; i reg = new List();# reg.Add(new Regex(“sS“);# reg.Add(new Re
5、gex(“wW“);# reg.Add(new Regex(“dD“);# 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 .Tex
6、t += “正则表达式:“ + re.ToString().PadRight(1 0 ) + “执行时间:“ + stopW.ElapsedMilliseconds.ToString() + “ ms“;# richTextBox2 .Text += “n-n“;# 测试结果:测试分两组进行,程序执行前内存占用为9 2 1 M一组是未使用量词,每次仅替换一个字符,执行时间如下,占用内存9 3 8 M复制代码代码如下:正则表达式:sS执行时间:2 6 5 1 ms-正则表达式:wW执行时间:2 5 1 5 ms-正则表达式:dD执行时间:2 1 8 7 ms-正则表达式:(.|n)执行时间:2
7、4 7 0 ms-正则表达式:(?s).执行时间:1 9 6 9 ms另一组使用了量词,一次替换所有字符,执行时间如下,占用内存1 1 2 8 M复制代码代码如下:测试结果(带量词)正则表达式:sS+执行时间:2 4 9 ms-正则表达式:wW+执行时间:3 4 8 ms-正则表达式:dD+执行时间:1 9 8 ms-正则表达式:(.|n)+执行时间:8 7 9 ms-正则表达式:(?s).+执行时间:1 1 3 ms-测试结果分析:匹配效率最高的是采用了Singleline这种匹配模式的“.”其次是“dD”,而“(.|n)”的匹配效率最低“sS”的匹配效率居中,只是习惯上用得多些注:由于各语言支持的引擎不同,即使使用同一种引擎,对正则做的优化也有所不同,所以以上性能测试结论可能仅适用于.NET。