又發現了一個 net 的bug!最近在使用正則表達式的時候發現在忽略大小寫的時候匹配值從 xff 到 xffff 之間的所有字符正則表達式竟然也能匹配兩個 ASCII 字符i(code: x) 和 I(code: x);但是仍然不能匹配其他的 ASCII 字母和數字
比如以下的代碼就是用來測試用正則表達式匹配從 xff 到 xffff 的字符而值范圍在 到 xfe 的所有字符是不能被匹配的
Regex regex = new Regex(@[/uFF/uFFFF]+);
// The characters whoes value are smaller than xff are not expected to be matched
for (int i = ; i < xff; i++) {
string s = new string(new char[] { (char)i });
DebugAssert(
!regexIsMatch(s)
stringFormat(The character was not expected to be matched: x{:X}! i));
}
// However the characters whoes value are greater than xfe are expected to be matched
for (int i = xff; i <= xffff; i++) {
string s = new string(new char[] { (char)i });
DebugAssert(
regexIsMatch(s)
stringFormat(The character was expected to be matched: x{:X}! i));
}
這時的運行結果是正常的沒有任何的斷言錯誤出現
然而當使用忽略大小寫的匹配模式時結果就不一樣了將上面代碼中的第一行改成
Regex regex = new Regex(@[/uFF/uFFFF]+ RegexOptionsIgnoreCase);
程序運行的時候就會有兩處斷言錯誤它們分別是字符值為 和 也就是小寫字母 i 和大寫字母 I 這個 bug 非常奇怪別的字符都很正常!而且用 javascript 腳本在 IE (版本是)裡面運行也同樣有這麼 bug 存在(比如下面這段代碼)然而在 Firefox 中運行就是沒有問題的還是 Firefox 好啊呵呵!
var re = /[/uFF/uFFFF]+/;
// var re = /[/uFF/uFFFF]+/i;
for(var i=; i<xff; i++) {
var s = StringfromCharCode( i );
if ( retest(s) ){
alert( Should not be matched: + i + ! );
}
}
for(var i=xff; i<=xffff; i++) {
var s = StringfromCharCode( i );
if ( !retest(s) ){
alert( Should be matched: + i + ! );
}
}
From:http://tw.wingwit.com/Article/program/net/201311/14920.html