Як я можу видалити символ із рядка за допомогою Javascript?


361

Я наближаюся до цього, але це просто неправильно. Все, що я хотів би зробити, це видалити персонаж 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, '')

Він працює лише в тому випадку, якщо я заміню його іншим символом. Це не просто вилучить.

Будь-які думки?


У чому тут проблема, "r" -си були видалені чи не так?
Володимир Деспотович

Відповіді:


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

замінить /rна /використання String.prototype.replace.

Крім того, ви можете використовувати регулярний вираз із глобальним прапором (як пропонують Ерік Реппен і Сагар Гала , нижче), щоб замінити всі події на

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

EDIT: Оскільки тут все так весело, а користувач1293504, схоже , не скоро повернеться, щоб відповісти на уточнюючі запитання, ось метод видалення 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)замість цього.


3
Четвертий персонаж не обов'язково"/"
jak.b

74

Простий функціональний спосіб JavaScript був би

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

проста, швидка, вона замінює глобально і не потребує функцій чи прототипів


3
Це чудово працює для мене. Поки я намагаюся mystring = mystring.replace ('/ r', '/'); він перетворює лише перший коректор, решта - як є.
rb vishnu

1
Я думаю, що це найкраще рішення, дуже просте, і вам не потрібно знати його регулярно.
комерційне самогубство

2
Четвертий персонаж не обов'язково'/'
jak.b

1
так чи інакше, згідно з тестами ( stackoverflow.com/questions/50463850/… ), якщо ви не пишете високу продуктивність (10 к операцій в секунду) javascript різниця в продуктивності не є проблемою або "високою ціною для оплати", тому я не бачу, як саме ваш коментар сприяти вирішенню
Strife86

Окрім неефективності (і така функція може використовуватися ітеративно в довгих списках, де це має значення), це не відповідає на питання ОП, яке залежить від індексу, а не від попереднього символу.
aamarks

49

Завжди є рядкові функції, якщо ви знаєте, що ви завжди збираєтеся видалити четвертий символ:

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

Це не спрацьовує при видаленні першого або останнього символу
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».

Редагувати: не бачив, що це другий 'r', перш ніж додати «/». Потрібно \ / уникнути '/' під час використання аргументу regEx. Дякую за обґрунтування, але я помилився, тому я виправлю і додам більше деталей для людей, зацікавлених краще зрозуміти основи regEx, але це спрацює:

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

Тепер для надмірного пояснення:

Під час читання / написання шаблону regEx подумайте про: <a символ чи набір символів> з подальшим <a символом чи набором діаграм> з подальшим <...

У regEx <a символ чи набір діаграм> можуть бути один за одним:

/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, Infact це відповісти на єдине питання , запитати Any thoughts?.
Еш Бурлаценко

Справедливо. Я не погоджуюся, але ... :) Я не заявив, але не думаю, що це кваліфікується як відповідь. Відповідь допомогла б вирішити проблему або, принаймні, пояснити більш детально та запропонувати ідею, як її виправити.
Кен Уайт

@KenWhite, я погоджуюсь, я щойно робив висновок, що ОП може зробити його питання зрозумілішим? Деякі люди хочуть лише вказувати в напрямку, а не просто давати відповідь.
Еш Бурлаценко

1
+1 для @paislee - ця відповідь не корисна, тому що в JavaScript немає такого поняття, як позначка.
simpleigh

2

Якщо це завжди 4-й знак у вашійString, ви можете спробувати:

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

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 ^
}

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

У деяких випадках це не буде працювати (наприклад, індекс = 0).
Томер

1

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

У 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 до мінімальної ортогональної бази.
Вітіко

1

Наступна функція найкраще працювала в моєму випадку:

public static cut(value: string, cutStart: number, cutEnd: number): string {
    return value.substring(0, cutStart) + value.substring(cutEnd + 1, value.length);
}

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

Сплайс мутує вихідний масив і повертає лише виконані елементи. Оскільки масиви нульово індексуються, цей приклад повернеться "" (оскільки 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)
    Додайте решту рядка.

Мінімізовано: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 байт!]

DEMO:

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)


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 # (різко) ви можете зробити порожній символ як "\ 0". Можливо, ви можете це зробити:

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

Шукайте в google або на серфінгу по interent і перевірте, чи JavaScript дозволяє вам робити порожні символи, як, наприклад, C #. Якщо так, то навчіться це робити, і можливо, функція substituAt нарешті запрацює, і ви досягнете того, що хочете!

Нарешті, що символ "r" буде видалений!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.