Ceea ce este cel mai rapid mod de a înlocui toate aparițiile unui șir/caracter într-un șir în JavaScript? Un timp
, un "pentru" -buclă, o expresie regulată?
Cel mai simplu ar fi să folosesc o expresie regulată cu " g " steagul pentru a înlocui toate instanțele:
str.replace(/foo/g, "bar")
Acesta va înlocui toate aparițiile de " foo " cu " bar " în șirul str
. Dacă aveți doar un șir de caractere, puteți converti la un RegExp obiect de genul asta:
var pattern = "foobar",
re = new RegExp(pattern, "g");
Încercați acest toții: 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);
}
Este foarte rapid, și se va lucra pentru TOATE aceste condiții că mulți alții nu reușesc pe:
"x".replaceAll("x", "xyz");
// xyz
"x".replaceAll("", "xyz");
// xyzxxyz
"aA".replaceAll("a", "b", true);
// bb
"Hello???".replaceAll("?", "!");
// Hello!!!
Lasă-mă să știu dacă puteți să-l rupe, sau ai ceva mai bun, dar asigurați-vă că se poate trece aceste 4 teste.
var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");
newString acum este 'E ca o strang'
Puteți utiliza următoarele:
newStr = str.replace(/[^a-z0-9]/gi, '_');
sau
newStr = str.replace(/[^a-zA-Z0-9]/g, '_');
Acest lucru este de gând să înlocuiască toate caracterele care nu sunt litere sau cifre pentru a ('_'). Simplă schimbare de subliniere valoare pentru orice ai vrea să-l înlocuiască.
Doar gândindu-mă la o viteză problema cred că este cazul sensibil exemplu oferit în link-ul de mai sus ar fi de departe cea mai rapidă soluție.
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 ar fi "Aceasta este un test de urgență sistemul de difuzare."
Cred că răspunsul este că depinde în totalitate de ceea ce intrări tale arata. Am creat o [JsFiddle](
), pentru a încerca o grămadă de acestea și un cuplu de propria mea împotriva diferitelor intrări. Nu contează cât mă uit la rezultate, nu vad nici un câștigător clar.funcția replaceAllOneCharAtATime(inSource, inToReplace, inReplaceWith) { var ieșire=""; var firstReplaceCompareCharacter = inToReplace.charAt(0); var sourceLength = inSource.lungime; var replaceLengthMinusOne = inToReplace.length - 1; pentru(var i = 0; i < sourceLength; i++){ var currentCharacter = inSource.charAt(i); var compareIndex = i; var replaceIndex = 0; var sourceCompareCharacter = currentCharacter; var replaceCompareCharacter = firstReplaceCompareCharacter; while(true){ dacă(sourceCompareCharacter != replaceCompareCharacter){ ieșire += currentCharacter; pauză; } dacă(replaceIndex >= replaceLengthMinusOne) { i+=replaceLengthMinusOne; ieșire += inReplaceWith; //a fost un meci pauză; } compareIndex++; replaceIndex++; dacă(i >= sourceLength){ // nu se potrivesc pauză; } sourceCompareCharacter = inSource.charAt(compareIndex) replaceCompareCharacter = inToReplace.charAt(replaceIndex); } replaceCompareCharacter += currentCharacter; } întoarcerea de ieșire; }
Am încercat un număr de aceste sugestii după ce și dea seama că o implementare am scris de acest lucru, probabil, de aproape 10 ani în urmă, de fapt, nu't de lucru complet (urât de producție bug într-un sistem de mult uitate, e't așa mereu?!)... ce am observat este ca cei care am incercat (am n't încercați-le pe toate) au avut aceeasi problema ca a mea, care este, ele nu't înlocuiască FIECARE apariție, doar primul, cel puțin pentru cazul testului de a obține "de testare....txt" jos "de testare.txt" prin înlocuirea ".." cu "."... poate am pierdut atât de regex situație? Dar am face o digresiune...
Deci, am rescris de implementare, după cum urmează. L's destul de simplu, deși bănuiesc că nu cel mai rapid, dar am, de asemenea, don't cred că diferența va conta cu moderne JS motoare, dacă nu're face acest lucru în interiorul o buclă strânsă desigur, dar care's întotdeauna cazul pentru nimic...
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;
}
Sper că vă ajută pe cineva!
Ce's cel mai rapid am don't știu, dar știu ce's cel mai ușor de citit - că ceea ce's mai scurt și mai simplu. Chiar dacă l's un pic mai lent decât alte soluții it's valoare de utilizare.
Deci utilizați:
"string".replace("a", "b");
"string".replace(/abc?/g, "def");
Și bucurați-vă de cod de bune în loc de repede (bine... 1/100000 sec. nu este o diferență) și urâtă. ;)
// 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;
};
Folosi replace()
metoda de String
obiect.
Așa cum am menționat în răspunsul selectat, de /g de pavilion ar trebui să fie utilizate în regex, în scopul de a înlocui toate ** cazuri de subșir în șir.
Am codat un punct de referință și testate primele 3 răspunsuri. Se pare că pentru scurt siruri de caractere (<500 de caractere) cel de-al treilea cel mai votat răspuns este mai rapid decât cel de-al doilea cel mai votat nimeni.
Pentru șiruri lungi (adăugați ".repet(300)" de testare string) cu atat mai repede este răspunsul 1 urmat de cel de-al doilea și al treilea.
Notă:
Cele de mai sus este valabil pentru browsere folosind motorul v8 (crom/crom etc). Cu firefox (SpiderMonkey motor) rezultatele sunt total diferite Verifica pentru voi insiva!!!! Firefox cu cea de-a treia soluție pare a fi mai mult de 4,5 ori mai rapid decât Chrome cu prima soluție... o nebunie :D
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;
// dacă(_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.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>
testul va rula timp de 10s (+2s) în timp ce faceți clic pe butonul.
Rezultatele mele (de pe acelasi 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)
Dragut, nu?
A luat libertatea de a adăuga mai multe rezultate
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 pe Galaxy Note 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 adaugand un plus de răspuns - utilizator.e-mail.replace(/foo/gi,"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)
[DEMO][1]
[1]: https://jsbin.com/botodet/3/edit?html la ieșire,