Как я могу удалить символ из строки, используя Javascript? - PullRequest
283 голосов
/ 30 марта 2012

Я так близко к этому, но это не правильно.Все, что я хотел бы сделать, это удалить символ «r» из строки.Проблема в том, что в строке более одного экземпляра «r».Однако это всегда символ с индексом 4 (то есть 5-й символ).

пример строки: "crt / r2002_2" Что я хочу: "crt / 2002_2"

Эта функция замены удаляетоба "r"

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

Производит: "ct / 2002_2"

Я попробовал эту функцию:

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

Это работает, только если я заменю его другим символом,Это не просто удалит его.

Есть мысли?

Ответы [ 17 ]

392 голосов
/ 30 марта 2012
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');

заменит /r на /, используя String.prototype.replace.

В качестве альтернативы вы можете использовать регулярное выражение с глобальным флагом (как предложено Эрик Реппен & Сагар Гала , ниже), чтобы заменить все вхождения на

mystring = mystring.replace(/\/r/g, '/');
55 голосов
/ 29 октября 2014

Простой функциональный способ javascript:

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

простой, быстрый, он заменяет глобально и не требует функций или прототипов

46 голосов
/ 30 марта 2012

Всегда есть строковые функции, если вы знаете, что всегда собираетесь удалить четвертый символ:

str.slice(0, 4) + str.slice(5, str.length))
26 голосов
/ 30 марта 2012

Ваш первый функционал почти прав. Просто удалите флаг «g», который обозначает «глобальный» (правка), и дайте ему некоторый контекст, чтобы найти второе «r».

Редактировать: не видел, чтобы это был второй 'r', поэтому добавил '/'. Требуется \ / для экранирования '/' при использовании аргумента regEx. Спасибо за возражения, но я ошибся, поэтому я исправлю и добавлю больше подробностей для людей, заинтересованных в лучшем понимании основ RegEx, но это будет работать:

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

Теперь для чрезмерного объяснения:

Когда вы читаете / пишете шаблон regEx, думайте так: <символ или набор символов>, затем <символ или набор символов>, а затем <... </p>

В regEx <символ или набор символов> может быть по одному за раз:

/each char in this pattern/

Так что читайте как e, затем a, затем c и т.д ...

Или один <символ или набор символов> могут быть символами, описанными классом символов:

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

Или расширен, чтобы соответствовать количеству символов (но все же лучше всего рассматривать его как отдельный элемент с точки зрения последовательного шаблона):

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

Так что собери кучу вместе:

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

И, конечно, я излишне уточнил, но я просто хотел сказать следующее:

/cat/

- это серия из 3 элементов шаблона (за вещью следует вещь, за которой следует вещь).

И вот так:

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

Как ни странно, как начинает выглядеть regEx, все это разбивается на ряд вещей (потенциально многосимвольных), следующих друг за другом последовательно. В некотором смысле это был базовый момент, но мне потребовалось некоторое время, чтобы пройти мимо, так что я зашел за борт, объясняя это здесь, поскольку считаю, что это поможет ОП и другим новичкам в RegEx понять, что происходит. Ключом к чтению / письму regEx является разбиение его на эти части.

11 голосов
/ 13 сентября 2013

Для глобальной замены '/ r' этот код работал для меня.

mystring = mystring.replace(/\/r/g,'');
4 голосов
/ 30 марта 2012

Просто исправь свой replaceAt:

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

mystring.replaceAt(4, 1);

Я бы назвал это removeAt вместо этого. :)

4 голосов
/ 30 марта 2012
return this.substr(0, index) + char + this.substr(index + char.length);

char.length - ноль. Вам нужно добавить 1 в этом случае, чтобы пропустить символ.

2 голосов
/ 18 февраля 2019

Создать функцию как показано ниже

  String.prototype.replaceAt = function (index, char) {
    if(char=='')
    {
    return this.slice(0,index)+this.substr(index+1 + char.length);
    }
    else
    {

    return this.substr(0, index) + char + this.substr(index + char.length);
    }
    }

Заменить дать символ, как показано ниже

  var a="12346";
    a.replaceAt(4,'5');

enter image description here

и для удаления символа в индексе укажите второй параметр в виде пустой строки

a.replaceAt (4, '');

enter image description here

2 голосов
/ 30 марта 2012

Это работает, только если я заменю его другим символом.Он не просто удалит его.

Это потому, что когда char равно "", char.length равно 0, поэтому ваши подстроки объединяются, образуя исходную строку.Следуя вашей попытке кода, сработает следующее:

String.prototype.replaceAt = function (index, char) {
    return this.substr(0, index) + char + this.substr(index + 1);
    //   this will 'replace' the character at index with char ^
}
2 голосов
/ 30 марта 2012

Если это всегда четвертый символ в вашей строке, вы можете попробовать:

yourString.replace(/^(.{4})(r)/, function($1, $2) { return $2; });
...