가장 빠른 길은 모두 바꿀지 지정하십시오. 문자열으로 / 문자 문자열으로 JavaScript 에서? 반면 'a', 'a' 를 위한 루프 정규식이?
'G' 를 함께 사용할 수 있는 가장 쉬운 약간만이라도 정규식이 플래깅 모두 바꿉니다.
str.replace(/foo/g, "bar")
이 항목을 모두 대체할 것 '을 (를)' 에서 '' '' foo 표시줄에는 문자열이어야 str. 그냥 문자열으로 있을 경우, 다음과 같은 RegExp 객체 redhat. 변환할 수 있습니다.
var pattern = "foobar",
re = new RegExp(pattern, "g");
이 시도하시겠습니까 어플라치알레:
String.prototype.replaceAll = function(str1, str2, ignore)
{
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
}
이러한 모든 조건을, 이를 위해 일하는 것은 매우 빠른 그 많은 다른 fail on:
"x".replaceAll("x", "xyz");
// xyz
"x".replaceAll("", "xyz");
// xyzxxyz
"aA".replaceAll("a", "b", true);
// bb
"Hello???".replaceAll("?", "!");
// Hello!!!
Break it, 아니면 네가 더 잘 할 수 있는지 알려주세요 뭔가를해야합니다 통과시킬 수 있지만, 이 4 가지 테스트를 합니다.
var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");
그냥 생각하고 문제를 빠르게 에서 제공하는 대소문자를 구별하지 생각한다 예제에서와 위 링크에서 약간만이라도 지금까지 가장 빠른 솔루션입니다.
var token = "\r\n";
var newToken = " ";
var oldStr = "This is a test\r\nof the emergency broadcasting\r\nsystem.";
newStr = oldStr.split(token).join(newToken);
뉴스트 약간만이라도 긴급 방송 system." ", 이는 테스트 중이다.
진짜 답이 완전히 파악하여 투입물 같이 달려 있다고 생각한다. 내가 만든 [이스피들] (
) 이 부부가 상대로 a bunch of 시도하시려면 내 스스로 다양한 투입물. 아무리 제가 볼 때, 나는 뚜렷한 결과를 볼 수 없다.함수은 어플라치알론차라타티메 (인소싱, 안토레프리스, 린레프리스비트) { var 출력입니다 = " ";; var 퍼스트레프리스콤파레커랙터 = 안토레프리스트하르트 (0); var 수르켈젠스 = 제오르세.렌크스. var 레프라켈젠스미노소네 안토레프리스자리 크시 = - 1. 대한 (var i = 0; 내가 <. 수르켈젠스. i++) { var = 제오르세스크라트 커랑커랙터 (i). var 콩파레이네스 = i, var 레프라세이네스 = 0; var 수르체콤파레커랙터 = 커랑커랙터. var 레프리스콤파레커랙터 = 퍼스트레프리스콤파레커랙터. 반면 (true) { if (수르체콤파레커랙터! = 레프리스콤파레커랙터) { 출력 + = 커랑커랙터. 브레이크. } if (레프라세이네스 > = 레프라켈젠스미노소네) { i+ = 레프라켈젠스미노소네. 출력 + = 린레프리스비트. a 매치 //was 브레이크. } compareIndex++. replaceIndex++. if (= i >, 수르켈젠스) { 해당되어서는 아닌 // 브레이크. } 수르체콤파레커랙터 = 제오르세스크라트 (콩파레이네스) 레프리스콤파레커랙터 = 안토레프리스트하르트 (레프라세이네스); } 레프리스콤파레커랙터 + = 커랑커랙터. } 반품하십시오 출력; }
나는 내가 쓴 적이 있다는 점을 이 후 많은 이러한 제안을 했다는 구현은 아마도 10 년 전, 실제로 완전히 빗나갔다 닫으십시오 didn& # 39 (nasty 운영본 버그 작업공간에서 긴 잊어 시스템에서든 isn& 있는 t # 39, 항상 운행에서어떠한?!). 내가 봤을때 내가 수준들과 인식할 수 있는 것은 (I didn& t # 39, 그들을 시험하노라 모두), 즉, wouldn& 내거냐 경식도 비슷한 문제를 안고 있다. # 39 만 t 의 첫 번째, 적어도 내 모든 에셋은 대체하십시오 테스트 케이스를 가져오는 test.txt" "; 아래로 test.txt" "; " 대체하여 ."; 함께 ." ";). 그래서 어쩌면 내가 누락했습니다 regex 말했다. 하지만 난 빗나가.
그래서, 내가 사랑하는 내 구축상의 다음과 같습니다. # 39 의 it& 꽤 있지만, 가장 빠른 하지만 난 또 내가 아닌 단순 꿰매 용의자요 don& # 39 는 현대 JS 엔진, 한 문제에 큰 차이는 없는 것 같습니다, re 이것을 루프 내부에 물론, 그 팽팽한 you& # 39 의 경우 that& # 39 항상 모든 것에 대한.
function replaceSubstring(inSource, inToReplace, inReplaceWith) {
var outString = inSource;
while (true) {
var idx = outString.indexOf(inToReplace);
if (idx == -1) {
break;
}
outString = outString.substring(0, idx) + inReplaceWith +
outString.substring(idx + inToReplace.length);
}
return outString;
}
희망을 주는 사람이!
그래서 사용:
"string".replace("a", "b");
"string".replace(/abc?/g, "def");
대신 빠르게 즐길 수 있고 좋은 코드 (음. 1 초 이하 1/100000 아닙니다 차이) and ugly. )
// Find, Replace, Case
// i.e "Test to see if this works? (Yes|No)".replaceAll('(Yes|No)', 'Yes!');
// i.e.2 "Test to see if this works? (Yes|No)".replaceAll('(yes|no)', 'Yes!', true);
String.prototype.replaceAll = function(_f, _r, _c){
var o = this.toString();
var r = '';
var s = o;
var b = 0;
var e = -1;
if(_c){ _f = _f.toLowerCase(); s = o.toLowerCase(); }
while((e=s.indexOf(_f)) > -1)
{
r += o.substring(b, b+e) + _r;
s = s.substring(e+_f.length, s.length);
b += e+_f.length;
}
// Add Leftover
if(s.length>0){ r+=o.substring(o.length-s.length, o.length); }
// Return New String
return r;
};
'복귀시킴 ()' 이 방법을 사용하여 'String' 객체에는.
언급한 regex 를 사용할 수 있는 / g 플래깅 선택한 대답을 할 수 있도록 모든 문자열의 복귀시킴 의 인스턴스를 구체화하십시오.
[2]: # 2116614 https://stackoverflow.com/questions/2116558/fastest-method-to-replace-all-instances-of-a-character-in-a-string/2116614
그냥 코드 및 테스트되었습니다 벤치마크입니다 첫 번째 3 분입니다. 파선-짧은 문장열 위한 것으로 보인다 (<, 500 자) 찬성 투표를 한 두 번째로 3 번째로 가장 빠른 속도로 그 답을 찾을 수 있습니다.
오래 문장열 (추가 " 그리피스 (300) "; 빠른 답변 1 여부를 문자열) 가 그 뒤를 이어 2, 3 위.
>. 위의 브라우저에 대한 진정한 v8 엔진을 사용하여 (크롬 등). >. 파이어폭스 (스피드먼키 엔진) 와 전혀 다른 결과가 >. 너희 확인할지!! >. Firefox 에서 세 번째 솔루션이므로 것 같습니다. 4.5 배) 보다 크롬 통해 첫 번째 솔루션입니다. 미친 d
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 거짓값 바벨. > 거짓값 -;
function log(data) {
document.getElementById("log").textContent += data + "\n";
}
benchmark = (() => {
time_function = function(ms, f, num) {
var z;
var t = new Date().getTime();
for (z = 0;
((new Date().getTime() - t) < ms); z++) f(num);
return (z / ms)
} // returns how many times the function was run in "ms" milliseconds.
function benchmark() {
function compare(a, b) {
if (a[1] > b[1]) {
return -1;
}
if (a[1] < b[1]) {
return 1;
}
return 0;
}
// functions
function replace1(s) {
s.replace(/foo/g, "bar")
}
String.prototype.replaceAll2 = function(_f, _r){
var o = this.toString();
var r = '';
var s = o;
var b = 0;
var e = -1;
// if (_c) = {_f _f.toLowerCase (); s = 오토로르카스 (); }
while((e=s.indexOf(_f)) > -1)
{
r += o.substring(b, b+e) + _r;
s = s.substring(e+_f.length, s.length);
b += e+_f.length;
}
// Add Leftover
if(s.length>0){ r+=o.substring(o.length-s.length, o.length); }
// Return New String
return r;
};
String.prototype.replaceAll = function(str1, str2, ignore) {
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g, "\\$&"), (ignore ? "gi" : "g")), (typeof(str2) == "string") ? str2.replace(/\$/g, "$$$$") : str2);
}
function replace2(s) {
s.replaceAll("foo", "bar")
}
function replace3(s) {
s.split('foo').join('bar');
}
function replace4(s) {
s.replaceAll2("foo", "bar")
}
funcs = [
[replace1, 0],
[replace2, 0],
[replace3, 0],
[replace4, 0]
];
funcs.forEach((ff) => {
console.log("Benchmarking: " + ff[0].name);
ff[1] = time_function(2500, ff[0], "foOfoobarBaR barbarfoobarf00".repeat(10));
console.log("Score: " + ff[1]);
})
return funcs.sort(compare);
}
return benchmark;
})()
log("Starting benchmark...\n");
res = benchmark();
console.log("Winner: " + res[0][0].name + " !!!");
count = 1;
res.forEach((r) => {
log((count++) + ". " + r[0].name + " score: " + Math.floor(10000 * r[1] / res[0][1]) / 100 + ((count == 2) ? "% *winner*" : "% speed of winner.") + " (" + Math.round(r[1] * 100) / 100 + ")");
});
log("\nWinner code:\n");
log(res[0][0].toString());
<textarea rows="50" cols="80" style="font-size: 16; resize:none; border: none;" id="log"></textarea>
끝 - < 스니핏 >;!
>. 이 테스트는 실행하십시오 10 (+2s) 를 위한 버튼을 클릭합니다.
내 결과 (같은 pc 에):
Chrome/Linux Ubuntu 64:
1. replace1 score: 100% *winner* (766.18)
2. replace4 score: 99.07% speed of winner. (759.11)
3. replace3 score: 68.36% speed of winner. (523.83)
4. replace2 score: 59.35% speed of winner. (454.78)
Firefox/Linux Ubuntu 64
1. replace3 score: 100% *winner* (3480.1)
2. replace1 score: 13.06% speed of winner. (454.83)
3. replace4 score: 9.4% speed of winner. (327.42)
4. replace2 score: 4.81% speed of winner. (167.46)
좋은 엉망하지 당번이에요?
Chrome/Windows 10
1. replace1 score: 100% *winner* (742.49)
2. replace4 score: 85.58% speed of winner. (635.44)
3. replace2 score: 54.42% speed of winner. (404.08)
4. replace3 score: 50.06% speed of winner. (371.73)
Firefox/Windows 10
1. replace3 score: 100% *winner* (2645.18)
2. replace1 score: 30.77% speed of winner. (814.18)
3. replace4 score: 22.3% speed of winner. (589.97)
4. replace2 score: 12.51% speed of winner. (331.13)
Edge/Windows 10
1. replace1 score: 100% *winner* (1251.24)
2. replace2 score: 46.63% speed of winner. (583.47)
3. replace3 score: 44.42% speed of winner. (555.92)
4. replace4 score: 20% speed of winner. (250.28)
갤럭시 노트 4 의 크롬
1. replace4 score: 100% *winner* (99.82)
2. replace1 score: 91.04% speed of winner. (90.88)
3. replace3 score: 70.27% speed of winner. (70.15)
4. replace2 score: 38.25% speed of winner. (38.18)
답 - 추가 @gumbo 우저스마일드레프리스 (/ foo / 이라는 bar" ";), 추가
/foo/g - Refers to the all string to replace matching the case sensitive
/foo/gi - Refers to the without case sensitive and replace all For Eg: (Foo, foo, FoO, fOO)
[1]: html, 출력입니다 https://jsbin.com/botodet/3/edit?