Comment remplacer tous les points d'une chaîne à l'aide de JavaScript

426

Je veux remplacer toutes les occurrences d'un point ( .) dans une chaîne JavaScript

Par exemple, j'ai:

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

Je veux obtenir: okay this is a string.

Jusqu'à présent, j'ai essayé:

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

mais cela se termine avec toute la chaîne remplacée par des espaces.

Omar Abid
la source
8
La réponse de aefxx est correcte, mais tout comme un FYI est que le caractère de période dans une expression régulière signifie correspondre à tout , donc tout étant un espace. Échapper avec la barre oblique inverse correspond à des périodes.
swilliams
Merci pour le conseil. J'ai eu quelques moments AHA (lors de la construction de l'application) avec Regex. Je déteste vraiment ça _ , avez-vous un bon tutoriel cool?
Omar Abid
rubular.com est ce que vous cherchez
LanguagesNamedAfterCofee
1
N'utilisez pas d'expression régulière pour quelque chose d'aussi trivial.
Steven Lu
Malheureusement, il ne semble pas qu'un non-regex puisse permettre le remplacement d'une chaîne plusieurs fois.
Steven Lu

Réponses:

777

Vous devez échapper au .car il a la signification d'un "caractère arbitraire" dans une expression régulière.

mystring = mystring.replace(/\./g,' ')
aefxx
la source
25
juste pour clarifier, le \ échappe les caractères spéciaux dans les expressions régulières, comme le. dans ce cas
realgt
ressemble à sed .. en quelque sorte .. :)
Paschalis
dans l'expression reagukar le point. signifie tout, celui-ci est la bonne solution!
Benjamin Fuentes
1
@Kingalione Qu'est-ce qui ne fonctionne pas exactement? Pourriez-vous élaborer?
aefxx
1
@Webwoman C'est à cela que sert le gmodificateur à la fin de l'expression. Considérez-le comme (g) lobalement.
aefxx
302

Encore une solution facile à comprendre :)

var newstring = mystring.split('.').join(' ');
Umesh Patil
la source
25
@HaggleLad parce que vous n'avez pas besoin de
jouer
5
N'est-ce pas beaucoup plus lent que l'expression régulière?
Jasper Kennis
1
@Jasper d'après ma compréhension, c'est en fait plus rapide dans la plupart des navigateurs, même si je ne l'ai pas moi-même évalué.
andrew
9
@BetoFrega Rien de tel que des données empiriques pour faire valoir votre cas :). Merci de fournir le lien!
testing123
3
Si vous utilisez RegExp, vous ne souhaitez pas stocker l'expression régulière dans une variable distincte en dehors de la boucle. Compiler / interpréter une expression régulière prend un certain temps, mais une fois qu'il est compilé, il peut être utilisé assez rapidement. Veuillez essayer ces tests que j'ai faits: 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('.', ' '));

Plus rapide que l'utilisation de l'expression régulière ...

EDIT:
Peut - être qu'au moment où j'ai fait ce code, je n'ai pas utilisé jsperf. Mais au final, une telle discussion est totalement inutile, la différence de performances ne vaut pas la lisibilité du code dans le monde réel, donc ma réponse est toujours valable, même si les performances diffèrent de l'approche regex.

EDIT2:
J'ai créé une bibliothèque qui vous permet de le faire en utilisant une interface fluide:

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

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

Fagner Brack
la source
1
Très utile. FYI: Il y a des caractères voyous après le point-virgule dans l'instruction d'alerte.
Patrick
Que voulez-vous dire par "personnage voyou"?
Fagner Brack
1
Il signifie entité & # 8203; deux fois, qui est le caractère Unicode 'ZERO WIDTH SPACE' (U + 200B). Plus d'informations sur fileformat.info/info/unicode/char/200b/index.htm
Cœur
@FagnerBrack Vous devriez probablement str.toLowerCase()sortir de la boucle pour des raisons de performances. De plus, la manipulation de la chaîne que vous recherchez est probablement moins qu'optimale. J'ai posté une réponse avec une version modifiée: stackoverflow.com/questions/2390789/…
sstur
@sstur Je suppose qu'il est nécessaire de remettre en minuscule la chaîne après manipulation. La manipulation de la chaîne que je recherche présente-t-elle une différence de performances considérable? Je suppose que la lisibilité dépasse les avantages (non testés).
Fagner Brack
22
str.replace(new RegExp(".","gm")," ")
macemers
la source
1
Fonctionne très bien pour remplacer la fonction =)
afreeland
15

Pour ce scénario simple, je recommanderais également d'utiliser les méthodes fournies avec le javascript.

Vous pouvez essayer ceci:

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

Salutations

Victor
la source
6

J'ajoute une double barre oblique inverse au point pour le faire fonctionner. Acclamation.

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

Ceci est plus concis / lisible et devrait fonctionner mieux que celui publié par Fagner Brack (toLowerCase non exécuté en boucle):

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

Usage:

alert('Bananas And Bran'.replaceAll('An', '(an)'));
sstur
la source
1
En fait, il semble que RegEx échappé fonctionne mieux que indexOf! Cela ne semble pas correct, mais JSPerf indique que c'est beaucoup plus rapide: jsperf.com/replaceall-indexof-vs-regex
sstur
Peut-être qu'au moment où j'ai fait ce code, je n'ai pas utilisé jsperf. Mais au final, une telle discussion est totalement inutile, la différence de performance ne vaut pas la lisibilité du code dans le monde réel, donc ma réponse est toujours valable.
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
la source
3
cela ne restera-t-il pas coincé dans une boucle infinie si vous lui donnez quelque chose comme replaceAll('&', '&'):? (certes, ce n'est pas un cas dans la question du PO)
Anentropic
Mais "& amp;" contient un &afin que la boucle ne manque jamais de choses à remplacer (et la chaîne continue de croître). Je l'ai essayé tout à l'heure et il a verrouillé mon navigateur ...
Anentropic
2

Voici une autre implémentation de replaceAll. J'espère que cela aide quelqu'un.

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

Ensuite, vous pouvez l'utiliser:

var myText = "Je m'appelle George";
var newText = myText.replaceAll ("George", "Michael");

scripto
la source
1
Cela ne gère pas la recherche / remplacement insensible à la casse. Il est donc fonctionnellement équivalent à:string.split(stringToFind).join(stringToReplace)
sstur
0

Exemple: je veux remplacer tous les guillemets doubles (") en guillemets simples (') Ensuite, le code sera comme ceci

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

@ scripto est un peu plus concis et sans 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;
}

Voici comment cela se cumule: http://jsperf.com/replace-vs-split-join-vs-replaceall/68

À
la source
0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};
Danon
la source
0
mystring.replace(new RegExp('.', "g"), ' ');
Idan
la source
-1

vous pouvez remplacer toutes les occurrences de n'importe quelle chaîne / caractère à l'aide de l'objet javasscript RegExp.

Voici le code,

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

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

while(patt.test(mystring)){

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

}
Rakesh Chaudhari
la source
-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
la source
Pour échapper au HTML, utilisezcreateTextNode
Downgoat