Cea mai rapidă metodă pentru a înlocui toate instanțele unui caracter într-un șir

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ă?

Comentarii la întrebare (7)
Soluția

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");
Comentarii (14)

Î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.

Comentarii (6)
var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");

newString acum este 'E ca o strang'

Comentarii (1)

De asemenea, puteți încerca:

string.split('foo').join('bar');
Comentarii (4)

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ă.

Comentarii (1)

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."

Comentarii (0)

Cred că răspunsul este că depinde în totalitate de ceea ce intrări tale arata. Am creat o [JsFiddle](https://jsfiddle.net/sgmnawf8/1/), 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.

  • RegExp fost't cel mai rapid în oricare dintre cazuri de testare, dar nu a fost't de rea.
  • Split/Join abordare pare mai rare pentru înlocuiri.
  • Asta am scris pare mai rapid pentru mici intrări și dens înlocuiri:

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; }

Comentarii (1)

Utilizarea Regex obiect astfel de prognoze

var regex = new RegExp('"', 'g'); str = str.înlocui(regex, '\'');

Acesta va înlocui toate apariție a " în '.

Comentarii (1)

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!

Comentarii (1)

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ă. ;)

Comentarii (0)
// 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;
};
Comentarii (2)

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.

Comentarii (2)

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">
Comentarii (0)

@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,

Comentarii (0)