方法1
txt.match(/str/g).length;
方法2
txt.split(str).length-1;
方法3
function strCountBy (txt, str){
let count = 0;
for(;;){let idx=txt.indexOf(str); if(idx<0)break; txt=txt.substring(idx+str.length); count++; }
return count;
}
方法4
function strCountBy (txt, str){
let count = 0;
for(;;count++){let idx=txt.indexOf(str); if(idx<0)break; txt=txt.substring(idx+str.length); }
return count;
}
方法5
function strCountBy (txt, str){
let count = 0 , idx;
while((idx=txt.indexOf(str,idx))>-1) { ++count; idx+=str.length; }
return count;
}
方法6
function strCountBy (txt, str){ let count=0 , pattern=RegExp(str,'g'); while(pattern.exec(txt))count++; return count; }
方法7
function strCountBy (txt, str){ let count=0 , pattern=RegExp(str,'g'); while(pattern.test(txt))count++; return count; }
方法8
function strCountBy (txt, str){ return txt.split(str).length-1; }
方法9
function strCountBy (txt, str){ return txt.match(RegExp(str,'g')).length; }
split的速度是最快的
测试代码1
<!doctype html><body><script>
strCountBy_methods =[
(txt, str)=>{ if( !txt || !str )return 0;
let count = 0;
for(;;){let idx=txt.indexOf(str); if(idx<0)break; txt=txt.substring(idx+str.length); count++; }
return count;
}
,
(txt, str)=>{ if( !txt || !str )return 0;
let count = 0;
for(;;count++){let idx=txt.indexOf(str); if(idx<0)break; txt=txt.substring(idx+str.length); }
return count;
}
,
(txt, str)=>{ if( !txt || !str )return 0;
let count = 0 , idx;
while((idx=txt.indexOf(str,idx))>-1) { ++count; idx+=str.length; }
return count;
}
,
(txt, str)=>{ if( !txt || !str )return 0; let count=0 , pattern=RegExp(str,'g'); while(pattern.exec(txt))count++; return count; }
,
(txt, str)=>{ if( !txt || !str )return 0; let count=0 , pattern=RegExp(str,'g'); while(pattern.test(txt))count++; return count; }
,
(txt, str)=>{ if( !txt || !str )return 0; return txt.split(str).length-1; }
,
(txt, str)=>{ if( !txt || !str )return 0; let ar= txt.match(RegExp(str,'g')); if(ar)return ar.length; return 0;}
]
const txt = `
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
`
function test(str){
const fl = document.createElement("fieldset"); fl.innerHTML="<legend>测试字段 = "+str+"</legend>"; document.body.append(fl);
const b = document.createElement("section"); fl.append(b); b.style.cssText="display:grid; grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr; grid-auto-rows:100px; border:1px blue solid; grid-gap:10px 30px;";
strCountBy_methods.forEach(f=>{
let count = f(txt, str);
let lb = document.createElement("label");
lb.innerHTML=(`<div style="font-size:25px; border:1px solid black; border-radius:5px; text-align:center; " >${count}</div>`);
b.append(lb);
});
}
test("Za"); test("zA"); test('789ABCD'); test('789ABCd'); test(); test(null); test(0); test(""); test("123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy")
const 执行次数 = 1000000;
let t = document.createElement("section"); t.innerHTML=`下面测是执行<label style="font-size:188%; color:blue; ">${执行次数}</label>次的速度测试`;
t.style.cssText="font-size:16px; color:white; background:black;"
document.body.appendChild(t);
function testSpeed(str){
const fl = document.createElement("fieldset"); fl.innerHTML="<legend>测试字段是 "+str+" , 测试其执行 "+执行次数+ "次的速度</legend>"; document.body.append(fl);
const b = document.createElement("section"); fl.append(b); b.style.cssText="display:grid; grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr; grid-auto-rows:100px; border:1px blue solid; grid-gap:10px 30px;";
strCountBy_methods.forEach(f=>{
let begin = Date.now();
for(let i=0; i<执行次数 ; i++) f(txt, str);
let cost = Date.now()-begin;
let lb = document.createElement("label");
lb.innerHTML=(`<div style="font-size:25px; border:1px solid black; border-radius:5px; text-align:center; " >耗时 ${cost} 毫秒</div>`);
b.append(lb);
});
}
testSpeed("Za"); testSpeed("zA"); testSpeed('789ABCD'); testSpeed('789ABCd'); testSpeed(); testSpeed(null); testSpeed(0); testSpeed(""); testSpeed("123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy");
</script></body>