¿Cómo puedo eliminar un carácter de una cadena usando JavaScript?
Estoy muy cerca de conseguir esto, pero simplemente no está bien. Todo lo que me gustaría hacer es eliminar el carácter r
de una cadena. El problema es que hay más de una instancia de r
en 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?
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');
reemplazará /r
con /
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 charAt
funciona, no reste 1 del índice en la tercera línea y utilícelo tmp.splice(i, 1)
en su lugar.
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.
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)
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.
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 removeAt
en su lugar. :)