So ersetzen Sie alle Punkte in einer Zeichenfolge mithilfe von JavaScript


426

Ich möchte alle Vorkommen eines Punktes ( .) in einer JavaScript-Zeichenfolge ersetzen

Zum Beispiel habe ich:

var mystring = 'okay.this.is.a.string';

Ich möchte bekommen : okay this is a string.

Bisher habe ich versucht:

mystring.replace(/./g,' ')

Dies führt jedoch dazu, dass alle Zeichenfolgen durch Leerzeichen ersetzt werden.


8
Die Antwort von aefxx ist richtig, aber genau wie ein FYI ist, dass das Punktzeichen in einem regulären Ausdruck bedeutet, dass alles übereinstimmt , also ist alles ein Leerzeichen. Wenn Sie mit dem Backslash davonkommen, bedeutet dies, dass die Perioden übereinstimmen.
Swilliams

Danke für den Tipp. Ich habe einige AHA-Momente (beim Erstellen der App) mit Regex. Ich hasse es wirklich _ , hast du ein cooles, gutes Tutorial?
Omar Abid

rubular.com ist das, wonach Sie suchen
LanguagesNamedAfterCofee


Leider sieht es nicht so aus, als ob ein Nicht-Regex das mehrfache Ersetzen eines Strings ermöglichen kann.
Steven Lu

Antworten:


777

Sie müssen dem entkommen, .weil es in einem regulären Ausdruck die Bedeutung eines "beliebigen Zeichens" hat.

mystring = mystring.replace(/\./g,' ')

25
Zur Verdeutlichung entgeht das \ Sonderzeichen in regulären Ausdrücken wie dem. in diesem Fall
Realgt

sieht aus wie sed .. irgendwie .. :)
Paschalis

im Reagukar-Ausdruck der Punkt. bedeutet alles, dies ist die richtige Lösung!
Benjamin Fuentes

1
@Kingalione Was genau funktioniert nicht? Könnten Sie näher darauf eingehen?
Aefxx

1
@Webwoman Dafür wird der gModifikator am Ende des Ausdrucks verwendet. Betrachten Sie es als (g) lobal.
Aefxx

301

Eine weitere Lösung, die leicht zu verstehen ist :)

var newstring = mystring.split('.').join(' ');

25
@ HaggleLad, weil Sie nicht mit Regex
Ton.yeung

5
Ist das nicht viel langsamer als Regexing?
Jasper Kennis

1
@Jasper nach meinem Verständnis ist es in den meisten Browsern tatsächlich schneller, obwohl ich es selbst nicht bewertet habe.
Andrew

9
@BetoFrega Nichts wie einige empirische Daten, um Ihren Fall zu machen :). Vielen Dank für die Bereitstellung des Links!
Testen123

3
Wenn Sie RegExp verwenden, möchten Sie den regulären Ausdruck in einer separaten Variablen außerhalb der Schleife speichern. Das Kompilieren / Interpretieren eines regulären Ausdrucks dauert einige Zeit, aber sobald er kompiliert ist, kann er ziemlich schnell verwendet werden. Bitte versuchen Sie diese Tests, die ich gemacht habe: jsperf.com/replace-vs-split-join-vs-replaceall/23
sanderd17

53
/**
 * ReplaceAll by Fagner Brack (MIT Licensed)
 * Replaces all occurrences of a substring in a string
 */
String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
    var _token;
    var str = this + "";
    var i = -1;

    if ( typeof token === "string" ) {

        if ( ignoreCase ) {

            _token = token.toLowerCase();

            while( (
                i = str.toLowerCase().indexOf(
                    _token, i >= 0 ? i + newToken.length : 0
                ) ) !== -1
            ) {
                str = str.substring( 0, i ) +
                    newToken +
                    str.substring( i + token.length );
            }

        } else {
            return this.split( token ).join( newToken );
        }

    }
return str;
};

alert('okay.this.is.a.string'.replaceAll('.', ' '));

Schneller als Regex ...

EDIT:
Vielleicht habe ich zu der Zeit, als ich diesen Code gemacht habe, jsperf nicht benutzt. Aber am Ende ist eine solche Diskussion völlig sinnlos, der Leistungsunterschied ist die Lesbarkeit des Codes in der realen Welt nicht wert, daher ist meine Antwort immer noch gültig, auch wenn die Leistung vom Regex-Ansatz abweicht.

EDIT2:
Ich habe eine Bibliothek erstellt, mit der Sie dies über eine fließende Oberfläche tun können:

replace('.').from('okay.this.is.a.string').with(' ');

Siehe https://github.com/FagnerMartinsBrack/str-replace .


1
Sehr hilfreich. Zu Ihrer Information: In der Warnmeldung befinden sich nach dem Semikolon Schurkenzeichen.
Patrick

Was meinst du mit "Schurkencharakter"?
Fagner Brack

1
Er meint Entität & # 8203; zweimal, das ist das Unicode-Zeichen 'ZERO WIDTH SPACE' (U + 200B). Weitere Informationen zu fileformat.info/info/unicode/char/200b/index.htm
Cœur

@FagnerBrack Sie sollten das str.toLowerCase()aus Leistungsgründen wahrscheinlich aus der Schleife verschieben. Außerdem ist die Bearbeitung der Zeichenfolge, nach der Sie suchen, wahrscheinlich nicht optimal. Ich habe eine Antwort mit einer modifizierten Version gepostet: stackoverflow.com/questions/2390789/…
sstur

@sstur Ich nehme an, es ist erforderlich, die Zeichenfolge nach der Manipulation erneut in Kleinbuchstaben zu schreiben. Ist das Manipulieren der gesuchten Zeichenfolge ein erheblicher Leistungsunterschied? Ich nehme an, die Lesbarkeit geht über die Vorteile (ungetestet).
Fagner Brack

22
str.replace(new RegExp(".","gm")," ")

1
Funktionierte hervorragend für die Ersetzungsfunktion =)
afreeland

15

Für dieses einfache Szenario würde ich auch empfehlen, die in Javascript integrierten Methoden zu verwenden.

Sie könnten dies versuchen:

"okay.this.is.a.string".split(".").join("")

Schöne Grüße


6

Ich füge dem Punkt einen doppelten Backslash hinzu, damit er funktioniert. Jubeln.

var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);

4

Dies ist prägnanter / lesbarer und sollte eine bessere Leistung erbringen als die von Fagner Brack veröffentlichte (toLowerCase wird nicht in einer Schleife ausgeführt):

String.prototype.replaceAll = function(search, replace, ignoreCase) {
  if (ignoreCase) {
    var result = [];
    var _string = this.toLowerCase();
    var _search = search.toLowerCase();
    var start = 0, match, length = _search.length;
    while ((match = _string.indexOf(_search, start)) >= 0) {
      result.push(this.slice(start, match));
      start = match + length;
    }
    result.push(this.slice(start));
  } else {
    result = this.split(search);
  }
  return result.join(replace);
}

Verwendungszweck:

alert('Bananas And Bran'.replaceAll('An', '(an)'));

1
Tatsächlich scheint es, dass RegEx mit Escapezeichen eine bessere Leistung als indexOf! Klingt nicht richtig, aber JSPerf zeigt an, dass es viel schneller ist: jsperf.com/replaceall-indexof-vs-regex
sstur

Vielleicht habe ich zu der Zeit, als ich diesen Code gemacht habe, jsperf nicht benutzt. Aber am Ende ist eine solche Diskussion völlig sinnlos, der Leistungsunterschied ist die Lesbarkeit des Codes in der realen Welt nicht wert, daher ist meine Antwort immer noch gültig.
Fagner Brack

2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

    while(word.indexOf(character) != -1)
        word = word.replace(character,replaceChar);

    return word;
}

3
Wird dies nicht in einer Endlosschleife stecken bleiben, wenn Sie es so etwas wie : replaceAll('&', '&')? (
Zugegeben

Aber "& amp;" enthält a, &damit der Schleife nie die zu ersetzenden Dinge ausgehen (und die Zeichenfolge wächst weiter). Ich habe es gerade versucht und es hat meinen Browser gesperrt ...
Anentropic

2

Hier ist eine weitere Implementierung von replaceAll. Hoffe es hilft jemandem.

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if (stringToFind === stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

Dann können Sie es verwenden:

var myText = "Mein Name ist George";
var newText = myText.replaceAll ("George", "Michael");


1
Dies behandelt das Suchen / Ersetzen ohne Berücksichtigung der Groß- und Kleinschreibung nicht. Es ist also funktional äquivalent zu:string.split(stringToFind).join(stringToReplace)
sstur

0

Beispiel: Ich möchte alle doppelten Anführungszeichen (") durch einfache Anführungszeichen (') ersetzen. Dann sieht der Code so aus

var str= "\"Hello\""
var regex = new RegExp('"', 'g');
str = str.replace(regex, '\'');
console.log(str); // 'Hello'

0

@ scripto ist etwas prägnanter und ohne prototype:

function strReplaceAll(s, stringToFind, stringToReplace) {
    if (stringToFind === stringToReplace) return s;
    for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind))
        s = s.replace(stringToFind, stringToReplace);
    return s;
}

So stapelt es sich: http://jsperf.com/replace-vs-split-join-vs-replaceall/68


0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};

0
mystring.replace(new RegExp('.', "g"), ' ');

-1

Sie können alle Vorkommen von Zeichenfolgen / Zeichen mithilfe des RegExp-Javasscript-Objekts ersetzen.

Hier ist der Code,

var mystring = 'okay.this.is.a.string';

var patt = new RegExp("\\.");

while(patt.test(mystring)){

  mystring  = mystring .replace(".","");

}

-5
var mystring = 'okay.this.is.a.string';
var myNewString = escapeHtml(mystring);

function escapeHtml(text) {
if('' !== text) {
    return text.replace(/&/g, "&")
               .replace(/&lt;/g, "<")
               .replace(/&gt;/g, ">")
               .replace(/\./g,' ')
               .replace(/&quot;/g, '"')
               .replace(/&#39/g, "'");
} 

Um HTML zu entkommen, verwenden SiecreateTextNode
Downgoat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.