|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
前天傍晚我发表了《Java的跨平台就是一句谎言。》,原本就是周末闲来无事,发表一篇略带争议性的博文让大家都来吵吵架,发表自己的看法,根本就没想着谁把谁打倒,一个行业或者是技术阵营是无法用短期口水仗打到对手的。又发明了一个.net的bug!比来在利用正则表达式的时分发明:在疏忽巨细写的时分,婚配值从0xff到0xffff之间的一切字符,正则表达式居然也能婚配两个ASCII字符:i(code:0x69)和I(code:0x49);可是仍旧不克不及婚配其他的ASCII字母和数字。 好比以下的代码就是用来测试用正则表达式婚配从0xff到0xffff的字符。而值局限在0到0xfe的一切字符是不克不及被婚配的。
1234567891011121314151617Regexregex=newRegex(@"[u00FF-uFFFF]+");
//Thecharacters,whoesvaluearesmallerthan0xff,arenotexpectedtobematched.
for(inti=0;i<0xff;i++){
strings=newstring(newchar[]{(char)i});
Debug.Assert(
!regex.IsMatch(s),
string.Format("Thecharacterwasnotexpectedtobematched:0x{0:X}!",i));
}
//However,thecharacterswhoesvaluearegreaterthan0xfeareexpectedtobematched.
for(inti=0xff;i<=0xffff;i++){
strings=newstring(newchar[]{(char)i});
Debug.Assert(
regex.IsMatch(s),
string.Format("Thecharacterwasexpectedtobematched:0x{0:X}!",i));
}
这时候的运转了局是一般的,没有任何的断言毛病呈现。
但是当利用疏忽巨细写的婚配形式时,了局就纷歧样了。将下面代码中的第一行改成:
1Regexregex=newRegex(@"[u00FF-uFFFF]+",RegexOptions.IgnoreCase);
程序运转的时分就会有两处断言毛病。它们分离是字符值为73和105,也就是小写字母i和年夜写字母I。这个bug十分奇异,其余字符都很一般!并且用javascript剧本在IE(版本是6.0)内里运转也一样有这么bug存在(好比上面这段代码)。但是在Firefox中运转就是没有成绩的。仍是Firefox好啊,呵呵!
1234567891011121314151617varre=/[u00FF-uFFFF]+/;
//varre=/[u00FF-uFFFF]+/i;
for(vari=0;i<0xff;i++){
vars=String.fromCharCode(i);
if(re.test(s)){
alert(Shouldnotbematched:+i+!);
}
}
for(vari=0xff;i<=0xffff;i++){
vars=String.fromCharCode(i);
if(!re.test(s)){
alert(Shouldbematched:+i+!);
}
}
就安全性而言,Java已经远远低于VB.NET,更无法与安全性著称的C#相比。 |
|