¿Cómo puedo eliminar un carácter de una cadena usando JavaScript?

Resuelto user1293504 asked hace 12 años • 0 respuestas

Estoy muy cerca de conseguir esto, pero simplemente no está bien. Todo lo que me gustaría hacer es eliminar el carácter rde una cadena. El problema es que hay más de una instancia de ren la cadena. Sin embargo, siempre es el carácter del índice 4 (es decir, el quinto carácter).

Cadena de ejemplo: crt/r2002_2

Lo que quiero: crt/2002_2

Esta función de reemplazo elimina ambosr

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

Produce:ct/2002_2

Probé esta función:

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

Sólo funciona si lo reemplazo con otro personaje. No lo eliminará simplemente.

¿Alguna idea?

user1293504 avatar Mar 30 '12 03:03 user1293504
Aceptado
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');

reemplazará /rcon /el uso de String.prototype.replace.

Alternativamente, puede usar expresiones regulares con una bandera global (como lo sugieren Erik Reppen y Sagar Gala , a continuación) para reemplazar todas las ocurrencias con

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

EDITAR: Dado que todos se están divirtiendo mucho aquí y el usuario1293504 no parece regresar pronto para responder preguntas aclaratorias, aquí hay un método para eliminar el enésimo carácter de una cadena:

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

Dado que el usuario1293504 usó el recuento normal en lugar de un recuento indexado a cero, tenemos que eliminar 1 del índice. Si desea utilizar esto para replicar cómo charAtfunciona, no reste 1 del índice en la tercera línea y utilícelo tmp.splice(i, 1)en su lugar.

JKirchartz avatar Mar 29 '2012 20:03 JKirchartz

Una forma simple y funcional de JavaScript sería

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

Simple, rápido, se reemplaza globalmente y no necesita funciones ni prototipos.

Strife86 avatar Oct 29 '2014 15:10 Strife86

Siempre están las funciones de cadena, si sabes que siempre vas a eliminar el cuarto carácter:

str.slice(0, 4) + str.slice(5, str.length)
simpleigh avatar Mar 29 '2012 20:03 simpleigh

Tu primera función es casi correcta. Simplemente elimine la bandera 'g' que significa 'global' (editar) y dele algo de contexto para detectar la segunda 'r'.

Editar: no vi que era la segunda 'r' antes, así que agregué la '/'. Necesita \/ para escapar de '/' cuando se utiliza un argumento regEx. Gracias por los votos a favor, pero me equivoqué, así que lo arreglaré y agregaré más detalles para las personas interesadas en comprender mejor los conceptos básicos de regEx, pero esto funcionaría:

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

Ahora la explicación excesiva:

Al leer/escribir un patrón regEx, piense en términos de: <un carácter o conjunto de caracteres> seguido de <un carácter o conjunto de caracteres> seguido de <...

En expresiones regulares <un carácter o conjunto de caracteres> podría ser uno a la vez:

/each char in this pattern/

Entonces lea como e, seguida de a, seguida de c, etc...

O un solo <un carácter o conjunto de caracteres> podrían ser caracteres descritos por una clase de carácter:

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

O ampliado para que coincida con una cantidad de caracteres (pero aún así es mejor pensar en un solo elemento en términos del patrón secuencial):

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

Así que junta un montón:

   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"]

Y, por supuesto, he elaborado demasiado, pero mi punto era simplemente esto:

/cat/

es una serie de 3 elementos de patrón (una cosa seguida de una cosa seguida de una cosa).

Y también lo es esto:

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

Por muy extraño que parezca la expresión regular, todo se divide en una serie de cosas (potencialmente cosas de varios caracteres) que se suceden secuencialmente. Es un punto algo básico, pero me tomó un tiempo superarlo, así que me excedí al explicarlo aquí, ya que creo que ayudaría al OP y a otros nuevos en RegEx a comprender lo que está sucediendo. La clave para leer/escribir expresiones regulares es dividirlas en esas partes.

Erik Reppen avatar Mar 29 '2012 20:03 Erik Reppen

Simplemente arregla tu replaceAt:

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

mystring.replaceAt(4, 1);

Yo lo llamaría removeAten su lugar. :)

Ken White avatar Mar 29 '2012 20:03 Ken White