Question Méthode la plus rapide pour remplacer toutes les occurrences d'un caractère dans une chaîne


Quel est le moyen le plus rapide de remplacer toutes les instances d'un string/character dans une chaîne de Javascript? UNE while, une for-loop, une regular expression?


481
2018-01-22 10:26


origine


Réponses:


Le plus simple serait d'utiliser une expression régulière avec g indicateur pour remplacer toutes les instances:

str.replace(/foo/g, "bar")

Cela remplacera toutes les occurrences de foo avec bar dans la chaîne str. Si vous avez juste une chaîne, vous pouvez le convertir en un objet RegExp comme ceci:

var pattern = "foobar",
    re = new RegExp(pattern, "g");

856
2018-01-22 10:33



Essayez ceci: http://dumpsite.com/forum/index.php?topic=4.msg8#msg8

String.prototype.replaceAll = function(str1, str2, ignore) 
{
    return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
} 

C'est très rapide, et ça marchera pour TOUTES ces conditions que beaucoup d'autres échouent:

"x".replaceAll("x", "xyz");
// xyz

"x".replaceAll("", "xyz");
// xyzxxyz

"aA".replaceAll("a", "b", true);
// bb

"Hello???".replaceAll("?", "!");
// Hello!!!

Faites-moi savoir si vous pouvez le casser, ou vous avez quelque chose de mieux, mais assurez-vous qu'il peut passer ces 4 tests.


117
2017-07-15 23:36



var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");

newString maintenant est 'Thas as a strang'


74
2018-01-22 10:30



Aussi, vous pouvez essayer:

string.split('foo').join('bar');

24
2017-12-25 23:13



Vous pouvez utiliser ce qui suit:

newStr = str.replace(/[^a-z0-9]/gi, '_');

ou

newStr = str.replace(/[^a-zA-Z0-9]/g, '_');

Cela va remplacer tous les caractères qui ne sont pas des lettres ou des chiffres ('_'). Modifiez simplement la valeur de soulignement pour tout ce que vous voulez remplacer.


9
2018-02-22 16:30



En pensant simplement à un problème de vitesse, je pense que l'exemple sensible à la casse fourni dans le lien ci-dessus serait de loin la solution la plus rapide.

var token = "\r\n";
var newToken = " ";
var oldStr = "This is a test\r\nof the emergency broadcasting\r\nsystem.";
newStr = oldStr.split(token).join(newToken);

newStr serait "Ceci est un test du système de diffusion d'urgence."


9
2018-03-03 21:14



Je pense que la vraie réponse est que cela dépend complètement de l'apparence de vos intrants. J'ai créé un JsFiddle pour essayer un tas de ces et un couple de moi-même contre diverses entrées. Peu importe comment je regarde les résultats, je ne vois pas de gagnant clair.

  • RegExp n'était pas le plus rapide dans tous les cas de test, mais ce n'était pas mal non plus.
  • L'approche Split / Join semble la plus rapide pour les remplacements rares.
  • Celui que j'ai écrit semble plus rapide pour les petites entrées et dense remplaçants:

    function replaceAllOneCharAtATime(inSource, inToReplace, inReplaceWith) {
        var output="";
        var firstReplaceCompareCharacter = inToReplace.charAt(0);
        var sourceLength = inSource.length;
        var replaceLengthMinusOne = inToReplace.length - 1;
        for(var i = 0; i < sourceLength; i++){
            var currentCharacter = inSource.charAt(i);
            var compareIndex = i;
            var replaceIndex = 0;
            var sourceCompareCharacter = currentCharacter;
            var replaceCompareCharacter = firstReplaceCompareCharacter;
            while(true){
                if(sourceCompareCharacter != replaceCompareCharacter){
                output += currentCharacter;
                break;
            }
            if(replaceIndex >= replaceLengthMinusOne) {
                i+=replaceLengthMinusOne;
                output += inReplaceWith;
                //was a match
                break;
            }
            compareIndex++; replaceIndex++;
            if(i >= sourceLength){
                // not a match
                break;
            }
            sourceCompareCharacter = inSource.charAt(compareIndex)
                replaceCompareCharacter = inToReplace.charAt(replaceIndex);
            }   
            replaceCompareCharacter += currentCharacter;
        }
        return output;
    }
    

7
2017-07-31 03:31



Ce qui est le plus rapide, je ne sais pas, mais je sais ce qui est le plus lisible - ce qui est le plus court et le plus simple. Même si c'est un peu plus lent que d'autres solutions, cela vaut la peine de l'utiliser.

Donc, utilisez:

 "string".replace("a", "b");
 "string".replace(/abc?/g, "def");

Et profitez d'un bon code plutôt que plus rapide (enfin ... 1/100000 sec. N'est pas une différence) et moche. ;)


6
2018-01-22 10:31



Utilisez un objet Regex comme celui-ci

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

Il remplacera toutes les occurrences de " dans '.


6
2017-10-15 13:37



Utilisez le replace() méthode de String objet.

Comme indiqué dans la réponse sélectionnée, l’indicateur / g doit être utilisé dans la regex, afin de remplacer tout instances de la sous-chaîne dans la chaîne.


6
2018-01-22 10:30