当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > .NET开发 正则表达式中的 Bug

ASP.NET
asp.net实现C#代码加亮显示
如何显示在线人数和所在位置
ASP.net生成文字图片
ASP.NET提供文件下载函数
一个简单的ASP.NET Forms 身份认证
在ASP.NET中实现多文件上传
asp.net 2.0中使用sitemapDATAsource做页面导航
通过ASP.net程序创建域帐户故障
为ASP.NET封装的SQL数据库访问类
在ASP.NET中跟踪和恢复大文件下载
SQL存储过程在.NET数据库中的应用
对“学号”、“身份证”的数字分析
把.NET程序部署到没有安装.NET Framwork的机器上
ASP.NET中同时支持简体和繁体中文
几十个ASP.NET性能优化的常用方法
.NET环境下五种邮件发送解决方案
.NET开发中正则表达式中BUG一例
.NET反射、委托技术与设计模式
.net中Windows窗体间的数据交互
ADO.NET访问Oracle 9i存储过程(上)

ASP.NET 中的 .NET开发 正则表达式中的 Bug


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

又发现了一个 .net 的 bug!最近在使用正则表达式的时候发现:在忽略大小写的时候,匹配值从 0xff 到 0xffff 之间的所有字符,正则表达式竟然也能匹配两个 ASCII 字符:i(code: 0x69) 和 I(code: 0x49);但是仍然不能匹配其他的 ASCII 字母和数字。

比如以下的代码就是用来测试用正则表达式匹配从 0xff 到 0xffff 的字符。而值范围在 0 到 0xfe 的所有字符是不能被匹配的。

以下为引用的内容:  

       1234567891011121314151617Regex regex = new Regex(@"[\u00FF-\uFFFF]+");
  // The characters, whoes value are smaller than 0xff, are not expected to be matched.
  for (int i = 0; i < 0xff; i++) {
  string s = new string(new char[] { (char)i });
  Debug.Assert(
  !regex.IsMatch(s),
  string.Format("The character was not expected to be matched: 0x{0:X}!", i));
  }
  // However, the characters whoes value are greater than 0xfe are expected to be matched.
  for (int i = 0xff; i <= 0xffff; i++) {
  string s = new string(new char[] { (char)i });
  Debug.Assert(
  regex.IsMatch(s),
  string.Format("The character was expected to be matched: 0x{0:X}!", i));
  }

这时的运行结果是正常的,没有任何的断言错误出现。

然而当使用忽略大小写的匹配模式时,结果就不一样了。将上面代码中的第一行改成:

以下为引用的内容:

1Regex regex = new Regex(@"[\u00FF-\uFFFF]+", RegexOptions.IgnoreCase);

程序运行的时候就会有两处断言错误。它们分别是字符值为 73 和 105,也就是小写字母 i 和大写字母 I。 这个 bug 非常奇怪,别的字符都很正常!而且用 javascript 脚本在 IE (版本是6.0)里面运行也同样有这么 bug 存在(比如下面这段代码)。然而在 Firefox 中运行就是没有问题的。还是 Firefox 好。

以下为引用的内容:

 1234567891011121314151617var re = /[\u00FF-\uFFFF]+/;
  // var re = /[\u00FF-\uFFFF]+/i;
  for(var i=0; i<0xff; i++) {
  var s = String.fromCharCode( i );
  if ( re.test(s) ){
  alert( 'Should not be matched: ' + i + '!' );
  }
  }
  for(var i=0xff; i<=0xffff; i++) {
  var s = String.fromCharCode( i );
  if ( !re.test(s) ){
  alert( 'Should be matched: ' + i + '!' );
  }
  }