Как я могу удалить символ из строки, используя Javascript?

364

Я так близок к получению этого, но это просто неправильно. Все, что я хотел бы сделать, это удалить символ 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, '')

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

Какие-нибудь мысли?

user1293504
источник
В чем проблема, все «р» были удалены?
Владимир Деспотович

Ответы:

477
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');

заменит /rс /помощью String.prototype.replace.

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

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

РЕДАКТИРОВАТЬ: Так как всем здесь так весело, и user1293504 , похоже, не вернется в ближайшее время, чтобы ответить на уточняющие вопросы, вот метод удаления N-го символа из строки:

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

Поскольку user1293504 использовал обычный счетчик вместо индекса с нулевым индексом, мы должны удалить 1 из индекса, если вы хотите использовать это для репликации того, как charAtработает, не вычитайте 1 из индекса в 3-й строке и используйте tmp.splice(i, 1)вместо этого.

JKirchartz
источник
3
Четвертый персонаж не обязательно"/"
jak.b
74

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

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

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

Strife86
источник
3
Это прекрасно работает для меня. Пока я пытаюсь mystring = mystring.replace ('/ r', '/'); он только преобразует первый корректор, остальные они как есть.
рб Вишну
1
Я думаю, что это лучшее решение, очень простое, и вам не нужно знать регулярное выражение для него!
Коммерческое самоубийство
2
Четвертый персонаж не обязательно является'/'
jak.b
1
в любом случае, согласно тестам ( stackoverflow.com/questions/50463850/… ), если только вы не пишете высокопроизводительную (10 тыс. операций в секунду) javascript, разница в производительности не является проблемой или «высокой ценой для оплаты», поэтому я не вижу, как именно ваш комментарий внести свой вклад в решение
Strife86
Помимо неэффективности (и такая функция может использоваться итеративно в длинных списках, где это важно), это не отвечает на вопрос OP, который зависит от индекса, а не от предыдущего символа.
aamarks
49

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

str.slice(0, 4) + str.slice(5, str.length))
simpleigh
источник
Это не работает при удалении первого или последнего символа
TekTimmy
3
@TekTimmy Почему бы и нет? str.slice(0, 0) + str.slice(1, str.length)удаляет первое и str.slice(0, str.length-1) + str.slice(str.length, str.length)удаляет последнее. (Конечно, вы бы удалили лишние части, если знаете, что всегда удаляете первую или последнюю, но если они переменные, они работают так же хорошо, как и любой другой индекс.)
JJJ
30

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

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

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

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

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

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

/each char in this pattern/

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

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

/[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 является разбиение его на эти части.

Эрик Реппен
источник
13

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

mystring = mystring.replace(/\/r/g,'');
Сагар Гала
источник
8

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

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

mystring.replaceAt(4, 1);

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

Кен Уайт
источник
1
Это на самом деле решает проблему ОП и почти не получает голосов, а два главных ответа не решают первоначальный вопрос!
aamarks
5
return this.substr(0, index) + char + this.substr(index + char.length);

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

Евгений Ретунский
источник
Это не отвечает на заданный вопрос; это просто объясняет, почему replaceAtне работает. Это должен быть комментарий к исходному вопросу, а не ответ. :)
Кен Уайт
@KenWhite, на самом деле это ответ на единственный вопрос Any thoughts?.
Эш Бурлаченко
Справедливо. Я не согласен, но ... :) Я не понизил голос, но я не думаю, что это квалифицируется как ответ. Ответ мог бы дать решение проблемы или, по крайней мере, объяснить более подробно и дать представление о том, как ее решить.
Кен Уайт
@KenWhite, я согласен, я просто подчеркивал, что ОП мог прояснить свой вопрос? Некоторые люди хотят указывать только направление, а не просто дать ответ.
Эш Бурлаченко
1
+1 для @paislee - этот ответ бесполезен, потому что в JavaScript нет такого понятия, как char.
Simpleigh
2

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

yourString.replace(/^(.{4})(r)/, function($1, $2) { return $2; });
Just_Mad
источник
2

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

Это потому, что когда 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 ^
}
paislee
источник
2

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

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

введите описание изображения здесь

и удалить символ с определенным индексом, дать второй параметр в виде пустой строки

a.replaceAt(4,'');

введите описание изображения здесь

Раджив
источник
2

Если вы просто хотите удалить один символ и если вам известен индекс символа, который вы хотите удалить, вы можете использовать следующую функцию:

/**
 * Remove single character at particular index from string
 * @param {*} index index of character you want to remove
 * @param {*} str string from which character should be removed
 */
function removeCharAtIndex(index, str) {
    var maxIndex=index==0?0:index;
    return str.substring(0, maxIndex) + str.substring(index, str.length)
}
dd619
источник
Это не будет работать в некоторых случаях (например, index = 0).
Томер
1

Мне не нравится использовать функцию замены для удаления символов из строки. Это не логично делать так. Обычно я программирую на C # (Sharp), и всякий раз, когда я хочу удалить символы из строки, я использую метод Remove класса String, но не метод Replace, даже если он существует, потому что, когда я собираюсь удалить, я удаляю, не заменить. Это логично!

В Javascript нет функции удаления для строки, но есть функция substr. Вы можете использовать функцию substr один или два раза, чтобы удалить символы из строки. Вы можете сделать следующую функцию, чтобы удалить символы в начале индекса до конца строки, точно так же, как метод c # сначала перегружает String.Remove (int startIndex):

function Remove(str, startIndex) {
    return str.substr(0, startIndex);
}

и / или вы также можете сделать следующую функцию для удаления символов в начальном индексе и в счетчике, как вторая перегрузка метода c # String.Remove (int startIndex, int count):

function Remove(str, startIndex, count) {
    return str.substr(0, startIndex) + str.substr(startIndex + count);
}

и тогда вы можете использовать эти две функции или одну из них для ваших нужд!

Пример:

alert(Remove("crt/r2002_2", 4, 1));

Выход: crt / 2002_2

Достижение целей с помощью техники без логики может вызвать путаницу в понимании кода и будущие ошибки, если вы будете делать это много в большом проекте!


источник
2
Я бы сказал, что введение посторонних методов намного более запутанно, чем просто использование String.prototype.replace, которое является частью базового API. Более того, понимание удаления как особого случая замены вполне логично с точки зрения программирования. Вы не должны пытаться сделать так, чтобы ваш API содержал все слова в английском словаре, вы должны попытаться свести ваш API к минимальной ортогональной базе.
Witiko
1

Следующая функция работала лучше всего для моего случая:

public static cut(value: string, cutStart: number, cutEnd: number): string {
    return value.substring(0, cutStart) + value.substring(cutEnd + 1, value.length);
}
TekTimmy
источник
1

Самый короткий путь - использовать сплайс

var inputString = "abc";
// convert to array and remove 1 element at position 4 and save directly to the array itself
let result = inputString.split("").splice(3, 1).join();
console.log(result);
Gabrielus
источник
Splice изменяет исходный массив и возвращает только элементы, на которые оно влияет. Поскольку массивы имеют нулевое индексирование, этот пример вернет "" (поскольку 3-й элемент в массиве является пробелом между cи ")
JKirchartz
1

Вы можете использовать это: if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

Объяснение:

  1. if ( str[4] === 'r' )
    Проверьте, является ли 5-й символ 'r'

  2. str.slice(0, 4)
    Нарезать строку, чтобы получить все до 'r'

  3. + str.slice(5)
    Добавьте остальную часть строки.

Minified: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 байт!]

ДЕМО:

function remove5thR (s) {
  s=s[4]=='r'?s.slice(0,4)+s.slice(5):s;
  console.log(s); // log output
}

remove5thR('crt/r2002_2')  // > 'crt/2002_2'
remove5thR('crt|r2002_2')  // > 'crt|2002_2'
remove5thR('rrrrr')        // > 'rrrr'
remove5thR('RRRRR')        // > 'RRRRR' (no change)

jak.b
источник
1
let str = '1234567';
let index = 3;
str = str.substring(0, index) + str.substring(index + 1);
console.log(str) // 123567 - number "4" under index "3" is removed
Назарий
источник
0

Это улучшение простого ответа (опустить длину)

s.slice(0,4)+s.slice(5)

Камил Келчевски
источник
-1

В C # (Sharp) вы можете сделать пустой символ как '\ 0'. Может быть, вы можете сделать это:

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

Ищите в Google или просматривайте интернет и проверяйте, позволяет ли JavaScript создавать пустые символы, как в C #. Если да, то узнайте, как это сделать, и, возможно, функция replaceAt, наконец, сработает, и вы добьетесь того, чего хотите!

Наконец этот символ 'r' будет удален!


источник