Come sostituire tutti i punti in una stringa usando JavaScript


426

Voglio sostituire tutte le occorrenze di un punto ( .) in una stringa JavaScript

Ad esempio, ho:

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

Voglio ottenere: okay this is a string.

Finora ho provato:

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

ma questo finisce con tutta la stringa sostituita da spazi.


8
la risposta di aefxx è corretta, ma proprio come una FYI è che il carattere punto in una regex significa corrispondere a tutto , quindi tutto essendo uno spazio. Sfuggirlo con la barra rovesciata significa abbinare i punti.
Swilliams,

Grazie per il consiglio. Ho alcuni momenti AHA (durante la creazione dell'app) con Regex. Lo odio davvero _ , hai qualche tutorial interessante e interessante?
Omar Abid,

rubular.com è quello che stai cercando
LanguagesNamedAfterCofee

1
Non usare una regex per qualcosa di così banale.
Steven Lu

Sfortunatamente non sembra che un non regex possa consentire la sostituzione di una stringa più volte.
Steven Lu

Risposte:


777

È necessario sfuggire a .perché ha il significato di "carattere arbitrario" in un'espressione regolare.

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

25
solo per chiarire, \ sfugge ai caratteri speciali in espressioni regolari, come il. in questo caso
realgt

sembra sed .. in qualche modo .. :)
Paschalis

nell'espressione reagukar il punto. significa tutto, questa è la soluzione corretta!
Benjamin Fuentes,

1
@Kingalione Cosa non funziona esattamente? Potresti elaborare?
aefxx,

1
@Webwoman Ecco a cosa serve il gmodificatore alla fine dell'espressione. Pensalo come (g) lobalmente.
aefxx

302

Un'altra soluzione che è facile da capire :)

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

25
@HaggleLad perché non devi scherzare con regex
ton.yeung

5
Non è molto più lento del regexing?
Jasper Kennis,

1
@Jasper da quanto ho capito, in realtà è più veloce nella maggior parte dei browser, anche se non l'ho ancora testato da solo.
Andrew,

9
@BetoFrega Niente come alcuni dati empirici per rendere il tuo caso :). Grazie per aver fornito il link!
testing123,

3
Se si utilizza RegExp, si desidera archiviare la regex in una variabile separata al di fuori del ciclo. Compilare / interpretare una regex richiede del tempo, ma una volta compilato, può essere usato abbastanza velocemente. Per favore prova questi test che ho fatto: 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('.', ' '));

Più veloce dell'uso di regex ...

EDIT:
Forse al momento in cui ho fatto questo codice non ho usato jsperf. Ma alla fine tale discussione è totalmente inutile, la differenza di prestazioni non vale la leggibilità del codice nel mondo reale, quindi la mia risposta è ancora valida, anche se le prestazioni differiscono dall'approccio regex.

EDIT2:
ho creato una libreria che ti permette di farlo usando un'interfaccia fluida:

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

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


1
Molto utile. Cordiali saluti: ci sono caratteri canaglia dopo il punto e virgola nell'istruzione di avviso.
Patrick,

Cosa intendi per "personaggio canaglia"?
Fagner Brack,

1
Intende entità & # 8203; due volte, ovvero il carattere Unicode 'ZERO WIDTH SPACE' (U + 200B). Maggiori informazioni su fileformat.info/info/unicode/char/200b/index.htm
Cœur

@FagnerBrack Probabilmente dovresti spostare str.toLowerCase()fuori dal ciclo per motivi di prestazioni. Inoltre, manipolare la stringa su cui stai cercando è probabilmente meno che ottimale. Ho inviato una risposta con una versione modificata: stackoverflow.com/questions/2390789/...
sstur

@sstur Suppongo che sia necessario minuscolare nuovamente la stringa dopo la manipolazione. Manipolare la stringa che sto cercando è una differenza notevole nelle prestazioni? Suppongo che la leggibilità vada oltre i benefici (non testato).
Fagner Brack,


15

Per questo semplice scenario, consiglierei anche di utilizzare i metodi forniti in javascript.

Puoi provare questo:

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

Saluti


6

Aggiungo una doppia barra rovesciata al punto per farlo funzionare. Cheer.

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

4

Questo è più conciso / leggibile e dovrebbe funzionare meglio di quello pubblicato da Fagner Brack (toLowerCase non eseguito in loop):

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

Uso:

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

1
In realtà, sembra che RegEx sia sfuggito a prestazioni migliori di indexOf! Non suona bene, ma JSPerf indica che è molto più veloce: jsperf.com/replaceall-indexof-vs-regex
sstur

Forse al momento ho fatto quel codice non ho usato jsperf. Ma alla fine tale discussione è totalmente inutile, la differenza di prestazioni non vale la leggibilità del codice nel mondo reale, quindi la mia risposta è ancora valida.
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
questo non rimarrà bloccato in un ciclo infinito se gli dai qualcosa del tipo replaceAll('&', '&'):? (è vero che non è un caso nella domanda del PO)
Anentropic,

Ma "& amp;" contiene un &così che il ciclo non si esaurisce mai di cose da sostituire (e la stringa continua a crescere). L'ho provato proprio ora e ha bloccato il mio browser ...
Anentropic

2

Ecco un'altra implementazione di replaceAll. Spero che aiuti qualcuno.

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

Quindi puoi usarlo:

var myText = "Il mio nome è George";
var newText = myText.replaceAll ("George", "Michael");


1
Questo non gestisce la ricerca / sostituzione senza distinzione tra maiuscole e minuscole. Quindi è funzionalmente equivalente a:string.split(stringToFind).join(stringToReplace)
sstur

0

Esempio: Voglio sostituire tutte le virgolette doppie (") in virgolette singole (') Quindi il codice sarà così

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

0

@ scripto è reso un po 'più conciso e senza 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;
}

Ecco come si accumula: 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

puoi sostituire tutte le occorrenze di qualsiasi stringa / carattere usando l'oggetto javasscript RegExp.

Ecco il codice,

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, "'");
} 

Per sfuggire all'HTML, usacreateTextNode
Downgoat il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.