.NET正则表达式中的 Bug

又发现了一个 .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 + '!' );
  }
  }
 

时间: 2024-11-29 13:25:27

.NET正则表达式中的 Bug的相关文章

正则表达式中的特殊字符

正则 字符/意义:对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释.例如:/b/匹配字符'b',通过在b 前面加一个反斜杠,也就是/b/,则该字符变成特殊字符,表示匹配一个单词的分界线.或者:对于几个字符,通常说明是特殊的,指出紧接着的字符不是特殊的,而应该按字面解释.例如:*是一个特殊字符,匹配任意个字符(包括0个字符):例如:/a*/意味匹配0个或多个a.为了匹配字面上的*,在a前面加一个反斜杠:例如:/a*/匹配'a*'. 字符^意义:表示匹配的字符必须在最前边.例如:/^

正则表达式中的特殊字符一览

正则 正则表达式中的特殊字符: 字符 意义:对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释. 例如:/b/匹配字符'b',通过在b 前面加一个反斜杠,也就是/b/,则该字符变成特殊字符,表示 匹配一个单词的分界线. 或者: 对于几个字符,通常说明是特殊的,指出紧接着的字符不是特殊的,而应该按字面解释. 例如:*是一个特殊字符,匹配任意个字符(包括0个字符):例如:/a*/意味匹配0个或多个a. 为了匹配字面上的*,在a前面加一个反斜杠:例如:/a*/匹配'a*'. 字符^ 意义

JavaScript正则表达式中的global属性的使用

这篇文章主要介绍了详解JavaScript正则表达式中的global属性的使用,是JS学习进阶中的重要知识点,需要的朋友可以参考下 global是正则表达式对象的只读布尔属性.它指定是否一个特定的正则表达式进行全局匹配.否则它使用"g"属性创建. 语法 ? 1RegExpObject.global 下面是参数的详细信息: NA 返回值: 如果"g"修改被设置返回"TRUE",否则返回"FALSE". 例子: ? 1 2 3 4

JavaScript正则表达式中的ignoreCase属性使用详解

    这篇文章主要介绍了JavaScript正则表达式中的ignoreCase属性使用详解,是JS学习进阶中的重要知识点,需要的朋友可以参考下 ignoreCase是正则表达式对象的只读布尔属性.它指定是否一个特定的正则表达式执行不区分大小写的匹配.,它与"i"属性创建. 语法 ? 1 RegExpObject.ignoreCase        下面是参数的详细信息: NA 返回值: 如果"i"修改被设置返回"TRUE",否则返回"

在JavaScript的正则表达式中使用exec()方法

         这篇文章主要介绍了在JavaScript的正则表达式中使用exec()方法,是JS入门学习中的基础知识,需要的朋友可以参考下              exec方法为正则表达式匹配的文本搜索字符串.如果找到匹配,则返回结果数组; 否则,返回null. 语法 ? 1 RegExpObject.exec( string ); 下面是参数的详细信息: string : 要搜索的字符串 返回值: 如果找到一个匹配,如果不为空,则返回匹配的文本. 例子: ? 1 2 3 4 5 6 7

JavaScript的正则表达式中test()方法的使用

这篇文章主要介绍了简述JavaScript的正则表达式中test()方法的使用,是JS入门学习中的基础知识,需要的朋友可以参考下 test方法为正则表达式匹配的文本搜索字符串.如果找到匹配,则返回true; 否则返回false. 语法 ? 1 RegExpObject.test( string ); 下面是参数的详细信息: string : 要搜索的字符串 返回值: 如果找到一个匹配,如果不为空,则返回匹配的文本. 例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1

js正则表达式中test,exec,match方法的区别介绍

 本篇文章主要是对js正则表达式中test,exec,match方法的区别进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 js正则表达式中test,exec,match方法的区别说明   test  test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert(reg.test(str)); // true     e

Java正则表达式中的捕获组的概念及相关API使用

要弄清这三个方法,首先要弄清Java正则表达式中的捕获组的概念.捕获组也就是Pattern中以括号对"()"分割出的子Pattern.至于为什么要用捕获组呢,主要是为了能找出在一次匹配中你更关心的部分.捕获组可以通过从左到右计算其开括号来编号.例如,在表达式 "(x)(y\\w*)(z)" 中,存在三个这样的组:  1.  x2.  y\\w*3.  z组零始终代表整个表达式.之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列.捕获的子序列

char-dos中的bug还是字体变大后显示的差别?

问题描述 dos中的bug还是字体变大后显示的差别? 自己写的java代码,输出的应该是一个char的空字符,dos中输出的也是一个char类型的空字符,但是如果将dos中属性下的字体调成10_*20,空的字符竟然显示成了a,但是其他字体还是显示的是char类型的空字符,难道是dos中的bug?还是编码情况的问题_. 解决方案 输出到文件,或者复制粘贴到记事本再观察.感觉是你程序的问题,这应该是一个不是空格的字符.