小数点可以匹配除了换行符“\n”以外的任意一个字符
一些细节
对于使用传统NFA引擎的大多数语言,如Java,.NET来说,“.”的匹配范围是这样的。
但是对于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"></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
---------------------------------------
*/
另一组使用了量词,一次替换所有字符,执行时间如下,占用内存1218M
/*--------输出--------
正则表达式:[\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
分享到:
相关推荐
在这个"正则基础之——小数点"的主题中,我们将深入探讨小数点在正则表达式中的应用。 1. 小数点(`.`)的元字符含义: 在正则表达式中,小数点(`.`)是一个元字符,它代表任意单个字符,除了换行符。这意味着`.`...
本文将详细介绍一个特定的正则表达式应用场景——如何使用正则表达式来限制用户只能输入数字、小数点以及负号,并通过具体的实例加以解释。 #### 1. 正则表达式基础概念 正则表达式(Regular Expression)是一种...
综上所述,正则表达式的三种逻辑思维——必须出现、可能出现、不能出现——是理解和设计正则表达式的基础。通过正确使用这三种逻辑,可以构建出复杂而精确的正则表达式来匹配各种文本模式。在实际应用中,还需要注意...
这里,`\.\d+`表示匹配一个小数点后跟着一个或多个数字字符。 ##### 7.3 有理数 匹配有理数(包含整数和小数)可以使用以下正则表达式:`^-?\d+(\.\d+)?(e-\d+)?$`。这里增加了`e-\d+`来匹配科学计数法中的指数...
本文档将详细介绍一个Java类——`RegularValidate`,它包含了用于验证各种格式数据(如身份证号、手机号、IP地址、数字、英文邮箱等)的正则表达式。 #### 二、正则表达式概述 在Java中,`java.util.regex`包提供了...
《编译原理——无符号数的算术四则运算语义处理程序实现》 在编译原理中,处理无符号数的算术四则运算语义是一项基础且重要的任务。这个程序设计实验旨在通过扩展实验一和实验二,实现一个能够识别并计算由无符号数...
在本压缩包中,我们关注的是一个与Python编程和LeetCode面试相关的主题——"有效数字"。LeetCode是一个在线平台,提供各种编程挑战,帮助程序员提高技能并为求职面试做准备。第65题,即“有效数字”,是其中的一个...
- 使用正则表达式 `/^[-]{0,1}(\d+)[\.]+(\d+)$/` 来匹配包含小数点的有效数字字符串,并且排除如 “.0” 或 “0.” 的无效格式。 ### 七、函数 isPort(str) 该函数用于验证输入字符串 `str` 是否为有效的端口号。...
- 整数:Ruby 支持两种整数类型——Fixnum 和 Bignum。Fixnum 用于表示系统平台上的常规整数范围,而 Bignum 则处理超出这个范围的大整数。在实际编程中,两者之间的转换是自动进行的,无需开发者手动干预。 - ...
#### 编译原理实验——词法分析器设计 在编译原理的课程中,设计与实现一个词法分析器是理解编译过程的关键一步。词法分析器(也称扫描器)是编译器的第一阶段,负责将源代码文本转换成一系列有意义的符号或“词”...
这里我们将深入探讨一个强大的JavaScript库——`autoNumeric`,它能帮助开发者解决这个问题,避免因小数点问题导致的错误,并提供灵活的货币符号显示方式。 `autoNumeric`是一款专注于自动格式化数字输入的开源库,...
词法分析是编译器的第一步,它是将源代码分解成一个个有意义的单元——词素。在这个主题中,我们将深入探讨词法分析程序的构建以及它在C++编程中的应用。 一、编译原理概述 编译原理是计算机科学的一个分支,主要...
总之,C#版的编译原理词法分析器是理解和解析C#源代码的重要工具,它通过识别和分类源代码中的各种元素,为编译过程的下一步——语法分析奠定了基础。理解其工作原理和实现细节对于学习编译器设计和C#语言有着深远的...
在计算机科学领域,编译原理是构建软件工具的基础,它涉及到如何将高级编程语言转换为机器可执行的指令。这次我们关注的是一个实际应用——"计算器源代码",这是一份用于实现基本计算功能的程序代码,它运用了编译...
本话题聚焦于“C#翻译算法”,特别提到了将数字字符串转换为数值的一种实例——"13638.14159"。这个例子暗示我们可能是在讨论如何处理和解析包含小数点的数字字符串。 翻译者模式是一种设计模式,它在软件工程中...
在本项目中,我们关注的是一个使用C#编程语言构建的Windows桌面应用程序——一个简单的计算器。这个计算器程序基于WinForm框架,是初学者学习C#和GUI编程的一个常见练习。让我们深入探讨一下该项目中的关键知识点。 ...
接着检查字符串是否为数字(`isNaN`)、是否包含小数点(`indexOf(".") != -1`)以及是否包含负号(`indexOf("-") != -1`),以此来确定字符串是否表示一个正整数。 **示例代码:** ```javascript function IsInteger...
在本项目中,我们关注的是一个特定的应用场景——"C#实现中文报价程序"。这个程序的设计目标是处理小数报价,并且特别针对中国货币单位的表达方式,如百千万千佰十元角分进行处理。以下将详细阐述这个项目的知识点和...