5465 Stimmen

Ersetzen aller Vorkommen einer Zeichenkette in JavaScript

Ich habe diese Zeichenfolge in meinem JavaScript-Code:

"Test abc test test abc test test test abc test test abc"

Tun:

str = str.replace('abc', '');

Scheint nur das erste Vorkommen von abc in der obigen Zeichenfolge.

Wie kann ich die alle Vorkommnisse davon?

2voto

Drewry Pope Punkte 125

Diese Lösung kombiniert einige frühere Antworten und entspricht etwas besser der vorgeschlagenen Standardlösung für August 2020. Diese Lösung ist für mich auch im September 2020 noch praktikabel, da String.replaceAll ist nicht verfügbar in der node Binärdatei, die ich verwende.


RegExp.escape ist ein separates Thema, das hier aber wichtig ist, weil die offiziell vorgeschlagene Lösung automatisch die string -basiert find Eingabe. Diese String.replaceAll Polyfill würde nicht ohne die RegExp.escape Logik.

Ich habe eine Antwort hinzugefügt, die kein Polyfill beinhaltet RegExp.Escape für den Fall, dass Sie das nicht wollen.


Wenn Sie eine RegExp a find Sie MUSS einschließen. g als Flagge. Dieses Polyfill wird keinen netten TypeError für Sie bereitstellen und wird Ihnen eine große schlechte Zeit verursachen.

Wenn Sie exakte Standardkonformität für eine Anwendung benötigen, die sich strikt auf die Standardimplementierung verlässt, dann empfehle ich die Verwendung von babel oder ein anderes Tool, das Ihnen jedes Mal die "richtige Antwort" liefert, anstatt SO dot com. Auf diese Weise erleben Sie keine Überraschungen.


Code:

if (!Object.prototype.hasOwnProperty.call(RegExp, 'escape')) {
  RegExp.escape = function(string) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
    // https://github.com/benjamingr/RegExp.escape/issues/37
    return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
  };
}

if (!Object.prototype.hasOwnProperty.call(String, 'replaceAll')) {
  String.prototype.replaceAll = function(find, replace) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll
    // If you pass a RegExp to 'find', you _MUST_ include 'g' as a flag.
    // TypeError: "replaceAll must be called with a global RegExp" not included, will silently cause significant errors. _MUST_ include 'g' as a flag for RegExp.
    // String parameters to 'find' do not require special handling.
    // Does not conform to "special replacement patterns" when "Specifying a string as a parameter" for replace
    // Does not conform to "Specifying a function as a parameter" for replace
    return this.replace(
          Object.prototype.toString.call(find) == '[object RegExp]' ?
            find :
            new RegExp(RegExp.escape(find), 'g'),
          replace
        );
  }
}

Code, Minified:

Object.prototype.hasOwnProperty.call(RegExp,"escape")||(RegExp.escape=function(e){return e.replace(/[.*+\-?^${}()|[\]\\]/g,"\\$&")}),Object.prototype.hasOwnProperty.call(String,"replaceAll")||(String.prototype.replaceAll=function(e,t){return this.replace("[object RegExp]"==Object.prototype.toString.call(e)?e:new RegExp(RegExp.escape(e),"g"),t)});

Beispiel:

console.log(
  't*.STVAL'
    .replaceAll(
      new RegExp(RegExp.escape('T*.ST'), 'ig'),
      'TEST'
    )
);

console.log(
  't*.STVAL'
    .replaceAll(
      't*.ST',
      'TEST'
    );
);

Code ohne RegExp.Escape :

if (!Object.prototype.hasOwnProperty.call(String, 'replaceAll')) {
  String.prototype.replaceAll = function(find, replace) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll
    // If you pass a RegExp to 'find', you _MUST_ include 'g' as a flag.
    // TypeError: "replaceAll must be called with a global RegExp" not included, will silently cause significant errors. _MUST_ include 'g' as a flag for RegExp.
    // String parameters to 'find' do not require special handling.
    // Does not conform to "special replacement patterns" when "Specifying a string as a parameter" for replace
    // Does not conform to "Specifying a function as a parameter" for replace
    return this.replace(
          Object.prototype.toString.call(find) == '[object RegExp]' ?
            find :
            new RegExp(find.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'), 'g'),
          replace
        );
  }
}

Code ohne RegExp.Escape , Verkleinert:

Object.prototype.hasOwnProperty.call(String,"replaceAll")||(String.prototype.replaceAll=function(e,t){return this.replace("[object RegExp]"==Object.prototype.toString.call(e)?e:new RegExp(e.replace(/[.*+\-?^${}()|[\]\\]/g,"\\$&"),"g"),t)});

2voto

Asakkour Soufiane Punkte 446

Teilen und Verbinden verwenden

var str = "Test abc test test abc test test test abc test test abc";
var replaced_str = str.split('abc').join('');
console.log(replaced_str);

2voto

JavaScript bietet eine direkte Möglichkeit, einen Teil einer Zeichenkette durch eine andere Zeichenkette zu ersetzen, und es gibt auch einige Tricks, mit denen Sie dies tun können.

Um alle Vorkommen zu ersetzen, können Sie Folgendes verwenden replace() o replaceAll Methode in JavaScript.

  1. replace() method - Um alle Elemente mit dieser Methode zu ersetzen, verwenden Sie einen regulären Ausdruck als Muster, um die übereinstimmende Zeichenkette zu finden und sie dann durch eine neue Zeichenkette zu ersetzen. Bitte beachten Sie, dass die /g Flagge mit.

    const str = "To do or not to do"; const pattern = /do/g; const replaceBy = "Code"; console.log(str.replace(pattern, replaceBy));

  2. replaceAll() method - Um alle Elemente mit dieser Methode zu ersetzen, verwenden Sie entweder eine Zeichenkette oder einen regulären Ausdruck als Muster, um die übereinstimmende Zeichenkette zu finden und sie dann durch eine neue Zeichenkette zu ersetzen. Wir müssen die /g Flagge mit einem regulären Ausdruck in der replaceAll Methode.

    const str = "To do or not to do"; const pattern = "do"; const replaceBy = "Code"; console.log(str.replaceAll(pattern, replaceBy));

    const pattern2 = /do/g; console.log(str.replaceAll(pattern2, replaceBy));

Alternative Methode: Mit der Methode "Teilen und Verbinden

Teilen Sie die Zeichenkette an der Stelle, die Sie ersetzen möchten, und fügen Sie sie zusammen, indem Sie die neue Zeichenkette als Trennzeichen verwenden. Siehe das Beispiel.

const str = "To do or not to do";
const newStr = str.split("do").join("Code");
console.log(newStr);

2voto

KARTHIKEYAN.A Punkte 14230

In String erstes Element suchen und ersetzen

var str = '[{"id":1,"name":"karthikeyan.a","type":"developer"}]'
var i = str.replace('"[','[').replace(']"',']');
console.log(i,'//first element search and replace')

Bei der globalen Suche und Ersetzung von Strings

var str = '[{"id":1,"name":"karthikeyan.a","type":"developer"}]'
var j = str.replace(/\"\[/g,'[').replace(/\]\"/g,']');
console.log(j,'//global search and replace')

2voto

C. Morgan Punkte 99

Dieses Problem kann mit regulären Ausdrücken und dem Flag gelöst werden g was bedeutet, dass man nicht aufhört, wenn man die erste Übereinstimmung gefunden hat. Wirklich, reguläre Ausdrücke sind Lebensretter!

function replaceAll(string, pattern, replacement) {
    return string.replace(new RegExp(pattern, "g"), replacement);
}

// or if you want myString.replaceAll("abc", "");

String.prototype.replaceAll = function(pattern, replacement) {
    return this.replace(new RegExp(pattern, "g"), replacement);
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X