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.

Omar Abid
quelle
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
1
Verwenden Sie keinen regulären Ausdruck für etwas so Triviales.
Steven Lu
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,' ')
aefxx
quelle
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(' ');
Umesh Patil
quelle
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 .

Fagner Brack
quelle
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")," ")
Macemers
quelle
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

Sieger
quelle
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);
Kittichart
quelle
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)'));
sstur
quelle
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;
}
Joel
quelle
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");

scripto
quelle
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'
Neel Kamal
quelle
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

BEIM
quelle
0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};
Danon
quelle
0
mystring.replace(new RegExp('.', "g"), ' ');
Idan
quelle
-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(".","");

}
Rakesh Chaudhari
quelle
-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, "'");
} 
Neha
quelle
Um HTML zu entkommen, verwenden SiecreateTextNode
Downgoat