- 浏览: 297729 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
全站唯一是我么:
请问下该功能的jdk版本是1.4的么,还是以上的?
Java实现给图片添加水印 -
Janne:
请问,你解决这问题没?是怎么回事?我今天也遇到了,没解决
myeclipse6.5中使用jax-ws启动tomcat报错问题 -
xuedong:
studypi 写道你是怎么和新浪的技术联系的?能告诉一下我吗 ...
新浪微博第三方接口调用学习 -
studypi:
你是怎么和新浪的技术联系的?能告诉一下我吗,谢谢
新浪微博第三方接口调用学习 -
dove19900520:
有用,呵呵
IE,Firefox都不放弃(兼容性问题总结)
小数点可以匹配除了换行符“/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
转自:http://blog.csdn.net/lxcnn/article/details/4284817
发表评论
-
(从网上考过来的,收藏) javascript 正则表达式的贪婪与非贪婪
2012-10-08 10:35 891以下内容转自:http://www.cnitblog.com ... -
正则表达式常用验证
2011-08-24 12:20 857在前台很多地方需要验证输入格式,为了方便以后使用,把常用的整理 ... -
正则判断一个字符串里是否包含一些词
2011-08-16 16:53 3270今天项目里用到了正则,判断一个字符串里是不是包含这些词,词出 ... -
js取当前url参数
2011-07-19 11:14 1953js没有提供取当前url参数的方法,只能是自己从中截取了,在 ... -
正则手册
2011-07-07 16:53 1030给大家共享个正则手册 欢迎查看本人博客: ... -
[ ] 字符组(Character Classes) .
2011-07-06 17:31 829[]能够匹配所包含的一系列字符中的任意一个。需要注意的是,[ ... -
正则基础之——捕获组(capture group) .
2011-07-06 17:30 10071 概述 1.1 什么是捕获组 ... -
正则表达式学习参考
2011-07-06 17:28 777正则表达式学习参考 1 ... -
正则基础之——NFA引擎匹配原理 .
2011-07-06 17:22 1002NFA引擎匹配原理 1 ... -
正则基础之——环视 .
2011-07-06 17:21 573环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终 ... -
正则基础之——/b 单词边界 .
2011-07-06 17:20 8261 概述 “/b”匹配单词边界,不匹配任何 ... -
正则应用之——日期正则表达式
2011-07-06 17:18 10761 概述 首先需要说明的一点,无论是Win ... -
.NET正则基础之——.NET正则匹配模式 .
2011-07-06 17:16 23381 概述 匹配模式指的是一些可以改变正则表 ... -
.NET正则基础之——平衡组 .
2011-07-06 17:14 18191 概述 平衡组是微软在.NET中提出的一 ... -
正则基础之——非捕获组 .
2011-07-06 17:10 1370非捕获组:(?:Expression) 接触正则表达式不久的 ... -
正则基础之——反向引用 .
2011-07-06 17:09 13271 概述 捕获组捕获到的内容,不仅可以在 ... -
.NET正则基础——.NET正则类及方法应用 .
2011-07-06 17:07 11091 概述 初学 ... -
NET正则基础之——正则委托 .
2011-07-06 17:05 8471 概述 一般的正则替换,只能对匹配的子串做 ... -
正则基础之——贪婪与非贪婪模式 .
2011-07-06 17:03 9671 概述 贪婪 ... -
正则应用之——逆序环视探索
2011-07-06 17:01 12151 问题引出 前几天在CSDN论坛遇到这样 ...
相关推荐
在这个"正则基础之——小数点"的主题中,我们将深入探讨小数点在正则表达式中的应用。 1. 小数点(`.`)的元字符含义: 在正则表达式中,小数点(`.`)是一个元字符,它代表任意单个字符,除了换行符。这意味着`.`...
本文将详细介绍一个特定的正则表达式应用场景——如何使用正则表达式来限制用户只能输入数字、小数点以及负号,并通过具体的实例加以解释。 #### 1. 正则表达式基础概念 正则表达式(Regular Expression)是一种...
综上所述,正则表达式的三种逻辑思维——必须出现、可能出现、不能出现——是理解和设计正则表达式的基础。通过正确使用这三种逻辑,可以构建出复杂而精确的正则表达式来匹配各种文本模式。在实际应用中,还需要注意...
这里,`\.\d+`表示匹配一个小数点后跟着一个或多个数字字符。 ##### 7.3 有理数 匹配有理数(包含整数和小数)可以使用以下正则表达式:`^-?\d+(\.\d+)?(e-\d+)?$`。这里增加了`e-\d+`来匹配科学计数法中的指数...
在标题中的"icu.rar_VOIDR_icu_icu引擎",VOIDR可能是一个特定的项目或工具名,而"icu引擎"指的是ICU库的核心功能——文本处理引擎。 **Unicode** 是一种编码标准,它包含了世界上几乎所有的字符,确保不同语言的...
在本压缩包中,我们关注的是一个与Python编程和LeetCode面试相关的主题——"有效数字"。LeetCode是一个在线平台,提供各种编程挑战,帮助程序员提高技能并为求职面试做准备。第65题,即“有效数字”,是其中的一个...
- 整数:Ruby 支持两种整数类型——Fixnum 和 Bignum。Fixnum 用于表示系统平台上的常规整数范围,而 Bignum 则处理超出这个范围的大整数。在实际编程中,两者之间的转换是自动进行的,无需开发者手动干预。 - ...
《编译原理——无符号数的算术四则运算语义处理程序实现》 在编译原理中,处理无符号数的算术四则运算语义是一项基础且重要的任务。这个程序设计实验旨在通过扩展实验一和实验二,实现一个能够识别并计算由无符号数...
#### 编译原理实验——词法分析器设计 在编译原理的课程中,设计与实现一个词法分析器是理解编译过程的关键一步。词法分析器(也称扫描器)是编译器的第一阶段,负责将源代码文本转换成一系列有意义的符号或“词”...
本话题聚焦于“C#翻译算法”,特别提到了将数字字符串转换为数值的一种实例——"13638.14159"。这个例子暗示我们可能是在讨论如何处理和解析包含小数点的数字字符串。 翻译者模式是一种设计模式,它在软件工程中...
- 使用正则表达式 `/^[-]{0,1}(\d+)[\.]+(\d+)$/` 来匹配包含小数点的有效数字字符串,并且排除如 “.0” 或 “0.” 的无效格式。 ### 七、函数 isPort(str) 该函数用于验证输入字符串 `str` 是否为有效的端口号。...
词法分析是编译器的第一步,它是将源代码分解成一个个有意义的单元——词素。在这个主题中,我们将深入探讨词法分析程序的构建以及它在C++编程中的应用。 一、编译原理概述 编译原理是计算机科学的一个分支,主要...
这里我们将深入探讨一个强大的JavaScript库——`autoNumeric`,它能帮助开发者解决这个问题,避免因小数点问题导致的错误,并提供灵活的货币符号显示方式。 `autoNumeric`是一款专注于自动格式化数字输入的开源库,...
总之,C#版的编译原理词法分析器是理解和解析C#源代码的重要工具,它通过识别和分类源代码中的各种元素,为编译过程的下一步——语法分析奠定了基础。理解其工作原理和实现细节对于学习编译器设计和C#语言有着深远的...
3. **单词识别**:词法分析器根据预定义的规则(通常是正则表达式)来识别单词,如关键字(如`int`, `class`, `if`等)、标识符(用户自定义的变量名、函数名等)、常量(数字、字符串、布尔值等)和运算符(如`+`, ...
在本项目中,我们关注的是一个使用C#编程语言构建的Windows桌面应用程序——一个简单的计算器。这个计算器程序基于WinForm框架,是初学者学习C#和GUI编程的一个常见练习。让我们深入探讨一下该项目中的关键知识点。 ...
在计算机科学领域,编译原理是构建软件工具的基础,它涉及到如何将高级编程语言转换为机器可执行的指令。这次我们关注的是一个实际应用——"计算器源代码",这是一份用于实现基本计算功能的程序代码,它运用了编译...