Какой самый быстрый способ заменить все экземпляры строки/символа в строке в JavaScript? Цикл while
, цикл for
, регулярное выражение?
Проще было бы использовать регулярное выражение с флагом G для замены всех экземпляров:
str.replace(/foo/g, "bar")
Это позволит заменить все вхождения Фу
с БАР
в STR строку``. Если вы просто строку, можно преобразовать его в объект регулярного выражения вроде этого:
var pattern = "foobar",
re = new RegExp(pattern, "g");
Попробуйте это заменяет: http://dumpsite.com/forum/index.php?topic=4.msg8#msg8
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);
}
Это очень быстро, и он будет работать для всех этих условий что многие неудачи других:
"x".replaceAll("x", "xyz");
// xyz
"x".replaceAll("", "xyz");
// xyzxxyz
"aA".replaceAll("a", "b", true);
// bb
"Hello???".replaceAll("?", "!");
// Hello!!!
Дайте мне знать, если вы можете разбить его, или у вас есть что-то лучше, но убедитесь, что он может пройти эти 4 теста.
var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");
newString теперь 'Thas as a strang'
Вы можете использовать следующие:
newStr = str.replace(/[^a-z0-9]/gi, '_');
или
newStr = str.replace(/[^a-zA-Z0-9]/g, '_');
Это собирается заменить символы, которые не буквы или цифры ('_'). Просто измените подчеркнуть значение для все, что вы хотите, чтобы заменить его.
Просто думать об этом из выпуска скоростью я считаю, что регистр примера, приведенного в ссылке выше, будет однозначно самым быстрым решением.
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);
newStr будет "Это тест системы аварийного вещания.&и"
Я думаю, что настоящий ответ заключается в том, что он полностью зависит от того, что ваш вклад выглядеть. Я создал [JsFiddle](
), чтобы попробовать кучу и пару моих собственных от различных входов. Сколько ни смотрю на результаты, я не вижу явного победителя.replaceAllOneCharAtATime функции(собственный ресурс, inToReplace, inReplaceWith) { выход ВАР=" на глаз"; ВАР firstReplaceCompareCharacter = inToReplace.используя метод charat(0); ВАР sourceLength = собственный ресурс.длина; ВАР replaceLengthMinusOne = inToReplace.длина - 1; для(ВАР я = 0; Я &л; sourceLength; я++){ ВАР currentCharacter = собственный ресурс.используя метод charat(я); ВАР compareIndex = я; ВАР replaceIndex = 0; ВАР sourceCompareCharacter = currentCharacter; ВАР replaceCompareCharacter = firstReplaceCompareCharacter; в то время как(правда){ если(sourceCompareCharacter != replaceCompareCharacter){ выход += currentCharacter; перерыв; } если(replaceIndex >= replaceLengthMinusOne) { я+=replaceLengthMinusOne; выход += inReplaceWith; //был матч перерыв; } compareIndex++; replaceIndex++; если(я >= sourceLength){ // не совпадает перерыв; } sourceCompareCharacter = собственный ресурс.используя метод charat(compareIndex) replaceCompareCharacter = inToReplace.используя метод charat(replaceIndex); } replaceCompareCharacter += currentCharacter; } возврат продукции; }
Использовать regex объект такой
в <код>ВАР регулярное выражение = новое регулярное выражение(' С"', 'г'); ул. ул. =.замена(регулярное выражение, '\'');</код>
Он будет заменять все вхождения в <код>" и</код> в <код>'</код>.
Я попробовал несколько из этих предложений поняв, что я написал, Это, наверное, почти 10 лет назад фактически не'т работу полностью (противный производства ошибка в давно забытой системе, разве'т всегда так?!)... я заметил, что те, что я пробовал (я не'т попробовать их все) была такая же проблема, как у меня, то есть, они не'т заменить каждое вхождение, только первый, по крайней мере на моем тестовом случае попадания на "тест....тхт" и вниз, чтобы "тест.тхт на" заменить на ".." и с ".&и"... Может я пропустил так тестирую ситуации? Но я отвлекся...
Итак, я переписал реализации следующим образом. Это'ы чертовски просто, хотя я подозреваю, что не самый быстрый, но я не'т думаю, что разница будет не важно, современными JS и двигателей, если вы'повторно делать это в непрерывном цикле, конечно, но это's всегда дело за что-нибудь...
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/100000 сек. - это не разница) и уродливого ;)
// 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;
};
Используйте метод replace()
объекта String
.
Как упоминалось в выбранном ответе, в regex следует использовать флаг /g, чтобы заменить все экземпляры подстроки в строке.
Я просто закодированы эталоном и испытаны первые 3 ответы. Кажется, что для коротких строк (<500 символов) третье большинство проголосовало ответ быстрее, чем второй проголосовал один.
Для длинных строк (добавление и".повторяю(300)" на тестовой строкой) тем быстрее ответ 1, а затем второй и третий.
Примечание:
вышесказанное справедливо для браузеров, используя двигатель V8 (хром/хром и т. д.). с Firefox (движок SpiderMonkey) результаты совершенно разные проверить себя!! Firefox с третьей решение более чем в 4,5 раза быстрее, чем хром с первым решением... с ума :Д
в
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;
// если (°с){ АF = АF.столоверчением(); ы = о. столоверчением(); }
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 секунд (+2С), как вы нажмете на кнопку.
Мои результаты (на одном ПК):
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)
Chrome на Galaxy примечание 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)
@Гамбо, добавив дополнительную ответа пользователя.электронной почте.заменить (в/Foo/ги, То"баре");
/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]
[1]: https://jsbin.com/botodet/3/edit?html выход