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.


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,' ')

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(' ');

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 .


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


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


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

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

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

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


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'

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


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

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

-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(".","");

}

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

Pour échapper au HTML, utilisezcreateTextNode
Downgoat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.