525 votes

Comment supprimer un caractère d'une chaîne de caractères en utilisant JavaScript ?

Je suis sur le point de l'obtenir, mais ça ne va pas. Tout ce que je voudrais faire, c'est supprimer le caractère r à partir d'une chaîne de caractères. Le problème est qu'il y a plus d'une instance de r dans la chaîne. Cependant, il s'agit toujours du caractère à l'indice 4 (donc le 5e caractère).

Exemple de chaîne : crt/r2002_2

Ce que je veux : crt/2002_2

Cette fonction de remplacement supprime les deux r

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

Produit : ct/2002_2

J'ai essayé cette fonction :

String.prototype.replaceAt = function (index, char) {
    return this.substr(0, index) + char + this.substr(index + char.length);
}
mystring.replaceAt(4, '')

Cela ne fonctionne que si je le remplace par un autre caractère. Il ne suffit pas de le supprimer.

Des idées ?

0 votes

Quel est le problème ici, les "r" ont tous été enlevés, n'est-ce pas ?

0 votes

Non, le premier ne l'était pas.

657voto

JKirchartz Points 6237
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');

remplacera /r avec / en utilisant String.prototype.replace .

Alternativement, vous pouvez utiliser regex avec un drapeau global (comme suggéré par Erik Reppen & Sagar Gala ci-dessous) pour remplacer toutes les occurrences par

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

EDIT : Puisque tout le monde s'amuse tellement ici et utilisateur1293504 ne semble pas revenir de sitôt pour répondre aux questions de clarification, voici une méthode pour supprimer le Nième caractère d'une chaîne de caractères :

String.prototype.removeCharAt = function (i) {
    var tmp = this.split(''); // convert to an array
    tmp.splice(i - 1 , 1); // remove 1 element from the array (adjusting for non-zero-indexed counts)
    return tmp.join(''); // reconstruct the string
}

console.log("crt/r2002_2".removeCharAt(4));

Puisque user1293504 a utilisé le compte normal au lieu d'un compte à indexation nulle, nous devons enlever 1 de l'index, si vous souhaitez utiliser ceci pour reproduire comment charAt ne soustrait pas 1 de l'index sur la 3ème ligne et utilise tmp.splice(i, 1) à la place.

4 votes

Le quatrième caractère n'est pas nécessairement un "/"

1 votes

Cette fonction fonctionne parfaitement avec une seule correction. J'ai changé tmp.splice(i - 1 , 1) ; en tmp.splice(i , 1) ;

104voto

Strife86 Points 21

Un moyen simple et fonctionnel en javascript serait

mystring = mystring.split('/r').join('/')

simple, rapide, il remplace globalement et ne nécessite pas de fonctions ou de prototypes

3 votes

Cela fonctionne très bien pour moi. Alors que j'essaie mystring = mystring.replace('/r','/') ; il ne convertit que le premier correcteur, les autres restent tels quels.

1 votes

Je pense que c'est la meilleure solution, très simple et vous n'avez pas besoin de connaître les regex pour cela !

2 votes

Le quatrième caractère n'est pas nécessairement un '/'

77voto

simpleigh Points 1017

Il y a toujours les fonctions de chaîne, si vous savez que vous allez toujours supprimer le quatrième caractère :

str.slice(0, 4) + str.slice(5, str.length))

0 votes

Cela ne fonctionne pas lorsque l'on supprime le premier ou le dernier caractère.

4 votes

@TekTimmy Pourquoi pas ? str.slice(0, 0) + str.slice(1, str.length) supprime le premier et str.slice(0, str.length-1) + str.slice(str.length, str.length) supprime le dernier. (Bien sûr, vous supprimeriez les parties redondantes si vous savez que vous supprimez toujours la première ou la dernière, mais si ce sont des variables, elles fonctionnent aussi bien que n'importe quel autre index).

2 votes

Il y a un supplément ) à la fin.

34voto

Erik Reppen Points 2769

Votre premier func est presque correct. Il suffit d'enlever le drapeau 'g' qui signifie 'global' (édition) et de lui donner un contexte pour repérer le deuxième 'r'.

Edit : je n'ai pas vu que c'était le deuxième 'r' avant, donc j'ai ajouté le '/'. Il est nécessaire d'échapper au '/' lors de l'utilisation d'un argument regEx. Merci pour les votes positifs, mais j'avais tort, je vais donc corriger et ajouter plus de détails pour les personnes intéressées à mieux comprendre les bases de regEx, mais cela pourrait fonctionner :

mystring.replace(/\/r/, '/')

Maintenant, l'explication excessive :

Lorsque vous lisez/écrivez un modèle regEx, pensez en termes de : <a caractère ou ensemble de caractères> suivi par <a caractère ou ensemble de caractères> suivi par <...

Dans regEx <a caractère ou ensemble de caractères> pourrait être un à la fois :

/each char in this pattern/

Donc lire comme e, suivi de a, suivi de c, etc...

Ou encore, un seul <a caractère ou ensemble de caractères> pourrait être des caractères décrits par une classe de caractères :

/[123!y]/
//any one of these
/[^123!y]/
//anything but one of the chars following '^' (very useful/performance enhancing btw)

Il peut être étendu pour correspondre à une quantité de caractères (mais il est toujours préférable de le considérer comme un élément unique en termes de modèle séquentiel) :

/a{2}/
//precisely two 'a' chars - matches identically as /aa/ would

/[aA]{1,3}/
//1-3 matches of 'a' or 'A'

/[a-zA-Z]+/
//one or more matches of any letter in the alphabet upper and lower
//'-' denotes a sequence in a character class

/[0-9]*/
//0 to any number of matches of any decimal character (/\d*/ would also work)

Alors faites-en un paquet :

   var rePattern = /[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/g
   var joesStr = 'aaaAAAaaEat at Joes123454321 or maybe aAaAJoes all you can   eat098765';

   joesStr.match(rePattern);

   //returns ["aaaAAAaaEat at Joes123454321", "aAaAJoes all you can eat0"]
   //without the 'g' after the closing '/' it would just stop at the first   match and return:
   //["aaaAAAaaEat at Joes123454321"]

Et bien sûr, j'ai trop développé, mais ce que je voulais dire, c'est que.. :

/cat/

est une série de 3 éléments de motifs (une chose suivie d'une chose suivie d'une chose).

Et ceci aussi :

/[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/

Aussi farfelu que cela puisse paraître, regEx se résume à des séries de choses (potentiellement des choses à plusieurs caractères) qui se suivent séquentiellement. C'est un point assez basique mais qui m'a pris un certain temps pour le dépasser. J'ai donc décidé de l'expliquer ici car je pense que cela aidera le PO et d'autres personnes novices en regEx à comprendre ce qui se passe. La clé de la lecture/écriture d'un regEx est de le décomposer en plusieurs parties.

19voto

Ken White Points 73213

Réparez juste votre replaceAt :

String.prototype.replaceAt = function(index, charcount) {
  return this.substr(0, index) + this.substr(index + charcount);
}

mystring.replaceAt(4, 1);

Je l'appellerais removeAt à la place. :)

1 votes

Cette réponse résout en fait le problème du PO et n'obtient pratiquement aucun vote positif, alors que les deux premières réponses ne résolvent pas la question initiale !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X