当前位置: 首页 > 图文教程 > 网络编程 > 正则表达式 > Javascript 字符串字节长度计算函数代码与效率分析(for VS 正则)

正则表达式
去除内容中的html
转换文本为超连接和Email格式的代码
正则表达式regular expression详述(一)
正则表达式regular expression详述(二)
17种正则表达式
正则表达式练习器
ubbcode简单实用
在ASP中用“正则表达式对象”来校验数据的合法性
JScript中正则表达函数的说明与应用
截字符串 去除HTML标记
学习网址
ubb代码转换为html
Javascript正则表达式测试网页
正则表达式验证
一个特牛的日期时间判断正则表达式
好东西,老外用正则表达式写的HTML分离函数
asp的ubb函数(推荐)
正则表达式中的特殊字符
常用的匹配正则表达式和实例
正则表达式在UBB论坛中的应用

正则表达式 中的 Javascript 字符串字节长度计算函数代码与效率分析(for VS 正则)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 105 ::
收藏到网摘: n/a

下面的函数都是用于计算字符串长度,英文算一个,中文算两个。效果一样,效率却未必一样,大家可以自行选择下。 先看看一下两段代码吧,它们分别用for循环和正则表达式来检测字符串的字节长度:
for循环检测字符串的字节长度方法一:
复制代码 代码如下:

var lenFor = function(str){
var byteLen=0,len=str.length;
if(str){
for(var i=0; i<len; i++){
if(str.charCodeAt(i)>255){
byteLen += 2;
}
else{
byteLen++;
}
}
return byteLen;
}
else{
return 0;
}
}

使用方法
var strlength=lenFor(str)
for循环检测字符串的字节长度方法二:
复制代码 代码如下:

function LEN(str){
var i,sum=0;
for(i=0;i<str.length;i++){
if((str.charCodeAt(i)>=0) && (str.charCodeAt(i)<=255))
sum=sum+1;
else
sum=sum+2;
}
return sum;
}

正则表达式检测字符串的字节长度方法三:
有点代码比较精简,根据下面的测试,效率却不高,大家可以用上面的函数。
复制代码 代码如下:

var lenReg = function(str){
return str.replace(/[^\x00-\xFF]/g,'**').length;
};

var strlength2=lenReg(str)
我用以下代码段对以上两个函数进行测试,主要是测试其运行时间:
复制代码 代码如下:

var s = '......';//一个很长的字符串,这里不罗列
function a(){
var timeStart,timeEnd;
timeStart = new Date();
var s1 = lenReg(s);
timeEnd = new Date();
var t1 = (timeEnd - timeStart)*1000;
timeStart = new Date();
var s2 = lenFor(s);
timeEnd = new Date();
var t2 = (timeEnd - timeStart)*1000;
alert('lenReg: ' + s1 + ' time: ' + t1 + '\nlenFor: ' + s2 + ' time: ' + t2);
}
window.onload = function(){
a();
};

以上代码在浏览器载入完毕的时候弹出一个警示窗口,窗口上有两行信息:第一行是用正则表达式检测的字符串字节长度和所用时间(×1000);第二行是用for循环检测字符串字节长度和所用时间(×1000)。

我得到两种答案:
第一种:
lenReg: 25824 time: 20000
lenFor: 25824 time: 10000
第二种:
lenReg: 48795 time: 15000
lenFor: 48795 time: 25000
需要说明的是,两次测试所用的字符串为同一字符串。
为什么会相差那么大呢?我到底偷偷改了什么??以上我提过,“中文字符占用2个字节(与编码有关)”(本文第三段),中文字符占用多少个字节是与编码有关的,一般情况下,GB-2312和UTF-8编码中,中文字符占用2个字节,但是在iso-8859-1编码中,中文字符占用5个字节。
是的,问题就在于文档的编码。以上第一种情况的编码为:charset=UTF-8,第二种情况的编码为charset=iso-8859-1。

在中文网页中,我们一般都不会用charset=iso-8859-1进行编码(中文乱码),而是用charset=UTF-8或GB-2312进行编码。问题就在这里,比较一下以上的第一种情况吧:
lenReg: 25824 time: 20000
lenFor: 25824 time: 10000
如上所示,用正则表达式检测所用的时间竟然是for循环的两倍!!!!(其实,测试多次之后也不全部都是两倍,但大部分测试都是两倍)
为什么呢?
str.replace(/[^\x00-\xFF]/g,'**').length;
看看以上语句(lenReg函数中的语句)。就我个人理解,问题就出现在这里——replace的时候要遍历一次字符串,在调用length的时候又要遍历一次字符串,所以整个运算过程需要遍历两次字符串。而for循环只需要遍历一次——这应该就是问题所在了,但是我不是非常确定。
我不太确定以上的理解是否确切,但是从表面上分析应该是这样的。
那么,用正则表达式检测真的使算法更加复杂吗?还是以上没有充分利用正则表达式的优势?现在我还没有意义的想法,需要进一步去推敲。先保持着怀疑吧^_^……