Bagaimana saya bisa menghapus karakter dari string menggunakan Javascript?

364

Saya sangat dekat untuk mendapatkan ini, tetapi itu tidak benar. Yang ingin saya lakukan adalah menghapus karakter rdari string. Masalahnya adalah, ada lebih dari satu instance dari rdalam string. Namun, selalu karakter di indeks 4 (jadi karakter ke-5).

contoh string: crt/r2002_2

Apa yang saya inginkan: crt/2002_2

Fungsi ganti ini menghapus keduanya r

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

Menghasilkan: ct/2002_2

Saya mencoba fungsi ini:

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

Ini hanya berfungsi jika saya menggantinya dengan karakter lain. Itu tidak hanya akan menghapusnya.

Adakah pikiran?

pengguna1293504
sumber
Apa masalahnya di sini, "r" -s semua dihapus bukan?
Vladimir Despotovic

Jawaban:

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

akan diganti /rdengan /menggunakan String.prototype.replace.

Atau Anda bisa menggunakan regex dengan bendera global (seperti yang disarankan oleh Erik Reppen & Sagar Gala , di bawah) untuk mengganti semua kemunculan dengan

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

EDIT: Karena semua orang bersenang-senang di sini dan user1293504 tampaknya tidak akan kembali dalam waktu dekat untuk menjawab pertanyaan klarifikasi, berikut adalah metode untuk menghapus karakter ke-N dari string:

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

Karena user1293504 menggunakan penghitungan normal alih-alih penghitungan indeks-nol, kami harus menghapus 1 dari indeks, jika Anda ingin menggunakan ini untuk mereplikasi cara charAtkerja jangan kurangi 1 dari indeks pada baris ke-3 dan gunakan tmp.splice(i, 1)sebagai gantinya.

JKirchartz
sumber
3
Karakter keempat belum tentu a"/"
jak.b
74

Cara javascript fungsional sederhana akan

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

sederhana, cepat, ini menggantikan secara global dan tidak perlu fungsi atau prototipe

Strife86
sumber
3
Ini sangat bagus untuk saya. Sementara saya mencoba mystring = mystring.replace ('/ r', '/'); itu hanya mengubah korektor pertama, sisanya seperti apa adanya.
rb vishnu
1
Saya pikir itu solusi terbaik, sangat sederhana dan Anda tidak perlu tahu regex untuk itu!
Bunuh Diri Komersial
2
Karakter keempat belum tentu a'/'
jak.b
1
tetap menurut tes ( stackoverflow.com/questions/50463850/... ) kecuali jika Anda membuat kinerja tinggi (10k operasi per detik) javascript perbedaan kinerja bukan masalah atau "harga tinggi untuk dibayar" jadi saya tidak melihat bagaimana tepatnya komentar Anda berkontribusi pada solusi
Strife86
Selain tidak efisien (dan fungsi seperti ini dapat digunakan secara iteratif pada daftar panjang yang penting) ini tidak menjawab pertanyaan OP yang bergantung pada indeks, bukan pada karakter sebelumnya.
aamarks
49

Selalu ada fungsi string, jika Anda tahu Anda akan selalu menghapus karakter keempat:

str.slice(0, 4) + str.slice(5, str.length))
simpleigh
sumber
Ini tidak berfungsi saat menghapus karakter pertama atau terakhir
TekTimmy
3
@TekTimmy Kenapa tidak? str.slice(0, 0) + str.slice(1, str.length)menghapus yang pertama dan str.slice(0, str.length-1) + str.slice(str.length, str.length)menghapus yang terakhir. (Tentu saja Anda akan menghapus bagian-bagian yang berlebihan jika Anda tahu Anda selalu menghapus bagian pertama atau terakhir, tetapi jika mereka variabel mereka bekerja sama baiknya dengan indeks lainnya.)
JJJ
30

Fungsi pertama Anda hampir benar. Hapus saja 'g' flag yang merupakan singkatan dari 'global' (edit) dan berikan beberapa konteks untuk melihat 'r' kedua.

Sunting: tidak melihat itu adalah 'r' kedua sebelum menambahkan '/'. Perlu \ / untuk keluar dari '/' saat menggunakan regEx arg. Terima kasih atas upvotes tapi saya salah jadi saya akan memperbaiki dan menambahkan lebih banyak detail untuk orang yang tertarik memahami dasar-dasar regEx lebih baik tetapi ini akan berhasil:

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

Sekarang untuk penjelasan yang berlebihan:

Saat membaca / menulis pola regEx pikirkan dalam hal: <a character or set of charcters> diikuti oleh <a character atau set charcters> diikuti oleh <...

Dalam karakter regEx <a atau kumpulan karakter> bisa satu per satu:

/each char in this pattern/

Jadi baca sebagai e, diikuti oleh, diikuti oleh c, dll ...

Atau satu karakter <a atau serangkaian karakter> dapat berupa karakter yang dijelaskan oleh kelas karakter:

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

Atau diperluas untuk mencocokkan jumlah karakter (tetapi masih dianggap sebagai elemen tunggal dalam hal pola sekuensial):

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

Jadi smoosh a bunch bersama:

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

Dan tentu saja saya sudah terlalu panjang lebar tetapi maksud saya adalah bahwa ini:

/cat/

adalah serangkaian 3 elemen pola (sesuatu diikuti oleh sesuatu diikuti oleh sesuatu).

Demikian juga ini:

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

Meskipun regEx mulai terlihat aneh, semuanya terurai menjadi serangkaian hal (hal-hal yang berpotensi multi-karakter) mengikuti satu sama lain secara berurutan. Agak titik dasar tetapi satu yang perlu saya beberapa saat untuk melewati jadi saya sudah berlebihan menjelaskannya di sini karena saya pikir itu salah satu yang akan membantu OP dan orang lain yang baru untuk regEx memahami apa yang terjadi. Kunci untuk membaca / menulis regEx adalah memecahnya menjadi beberapa bagian.

Erik Reppen
sumber
13

Untuk penggantian global '/ r', kode ini berfungsi untuk saya.

mystring = mystring.replace(/\/r/g,'');
Sagar Gala
sumber
8

Perbaiki Anda replaceAt:

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

mystring.replaceAt(4, 1);

Saya akan menyebutnya sebagai removeAtgantinya. :)

Ken White
sumber
1
Ini sebenarnya memecahkan masalah OP dan nyaris tidak mendapatkan suara, sementara dua jawaban teratas tidak menyelesaikan pertanyaan awal!
aamarks
5
return this.substr(0, index) + char + this.substr(index + char.length);

char.lengthadalah nol. Anda harus menambahkan 1dalam hal ini untuk melewati karakter.

Eugene Retunsky
sumber
Ini tidak menjawab pertanyaan yang diajukan; itu hanya menjelaskan mengapa replaceAttidak berfungsi. Itu harus berupa komentar terhadap pertanyaan awal alih-alih jawaban. :)
Ken White
@ KenWhite, sebenarnya itu menjawab satu-satunya pertanyaan Any thoughts?,.
Ash Burlaczenko
Cukup adil. Saya tidak setuju, tapi ... :) Saya tidak mengundurkan diri, tapi saya pikir itu tidak memenuhi syarat sebagai jawaban. Sebuah jawaban akan memberikan solusi untuk masalah tersebut, atau setidaknya menjelaskan dengan lebih detail dan menawarkan ide bagaimana cara memperbaikinya.
Ken White
@ KenWhite, saya setuju, saya hanya membuat poin bahwa OP bisa membuat pertanyaannya lebih jelas? Beberapa orang hanya ingin menunjuk ke suatu arah daripada hanya memberikan jawaban.
Ash Burlaczenko
1
+1 untuk @paislee - jawaban ini tidak membantu karena tidak ada yang namanya char di JavaScript.
simpleigh
2

Jika selalu karakter ke-4 di String Anda, Anda dapat mencoba:

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

Ini hanya berfungsi jika saya menggantinya dengan karakter lain. Itu tidak hanya akan menghapusnya.

Ini karena ketika charsama dengan "", char.lengthadalah 0, maka substring Anda bergabung untuk membentuk string asli. Mengikuti upaya kode Anda, yang berikut ini akan berfungsi:

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
sumber
2

Buat fungsi seperti di bawah ini

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

Untuk mengganti beri karakter seperti di bawah ini

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

masukkan deskripsi gambar di sini

dan untuk menghapus karakter pada indeks tertentu, berikan parameter kedua sebagai string kosong

a.replaceAt(4,'');

masukkan deskripsi gambar di sini

Rajiv
sumber
2

Jika Anda hanya ingin menghapus satu karakter dan Jika Anda tahu indeks karakter yang ingin Anda hapus, Anda dapat menggunakan fungsi berikut:

/**
 * 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
sumber
Ini tidak akan berfungsi dalam beberapa kasus (misalnya indeks = 0).
Tomer
1

Saya tidak suka menggunakan fungsi ganti untuk menghapus karakter dari string. Ini tidak logis untuk melakukannya seperti itu. Biasanya saya memprogram dalam C # (Sharp), dan setiap kali saya ingin menghapus karakter dari string, saya menggunakan metode Hapus dari kelas String, tetapi tidak ada metode Ganti, meskipun ada, karena ketika saya akan menghapus, saya menghapus, tidak ada ganti. Ini logis!

Dalam Javascript, tidak ada fungsi hapus untuk string, tetapi ada fungsi substr. Anda dapat menggunakan fungsi substr satu atau dua kali untuk menghapus karakter dari string. Anda dapat membuat fungsi berikut untuk menghapus karakter pada indeks awal hingga akhir string, seperti metode c # yang pertama kali membebani String.Remove (int startIndex):

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

dan / atau Anda juga dapat membuat fungsi berikut untuk menghapus karakter pada indeks awal dan menghitung, seperti metode c # yang membebani String.Remove (int startIndex, int count):

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

dan kemudian Anda dapat menggunakan dua fungsi ini atau salah satunya untuk kebutuhan Anda!

Contoh:

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

Output: crt / 2002_2

Mencapai tujuan dengan melakukan teknik tanpa logika dapat menyebabkan kebingungan dalam memahami kode, dan kesalahan di masa depan, jika Anda sering melakukan ini dalam proyek besar!


sumber
2
Saya akan mengatakan bahwa memperkenalkan metode asing jauh lebih membingungkan daripada hanya menggunakan String.prototype.replace, yang merupakan bagian dari API dasar. Selain itu, memahami penghapusan sebagai kasus penggantian khusus cukup logis sejauh pemrograman berjalan. Anda seharusnya tidak mencoba membuat API Anda terdiri dari semua kata dalam kamus bahasa Inggris, Anda harus mencoba mengurangi API Anda menjadi basis ortogonal minimalnya.
Witiko
1

Fungsi berikut berfungsi paling baik untuk kasus saya:

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

Cara terpendek adalah menggunakan sambungan

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
sumber
Splice bermutasi array asli dan hanya mengembalikan elemen yang terpengaruh. Karena array nol-diindeks, contoh ini akan mengembalikan "" (karena elemen ke-3 dalam array adalah kosong antara cdan ")
JKirchartz
1

Anda bisa menggunakan ini: if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

Penjelasan:

  1. if ( str[4] === 'r' )
    Periksa apakah karakter ke-5 adalah a 'r'

  2. str.slice(0, 4)
    Iris string untuk mendapatkan semuanya sebelum 'r'

  3. + str.slice(5)
    Tambahkan sisa string.

Diminimalkan: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 byte!]

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)

jak.b
sumber
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
Nazariy
sumber
0

Ini adalah peningkatan dari jawaban sederhana sederhana (tanpa panjang)

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

Kamil Kiełczewski
sumber
-1

Di C # (Sharp), Anda dapat membuat karakter kosong sebagai '\ 0'. Mungkin Anda bisa melakukan ini:

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

Cari di google atau jelajahi di interent dan periksa apakah javascript memungkinkan Anda membuat karakter kosong, seperti C #. Jika ya, maka pelajari cara melakukannya, dan mungkin fungsi replaceAt akan bekerja pada akhirnya, dan Anda akan mencapai apa yang Anda inginkan!

Akhirnya karakter 'r' akan dihapus!


sumber