Javascript kullanarak bir dizeden bir karakteri nasıl kaldırabilirim?


364

Bunu almaya çok yakınım, ama doğru değil. Tüm yapmak istediğim karakter rbir dizeden kaldırmaktır . Sorun şu ki, rdizede birden fazla örneği var . Ancak, her zaman dizin 4'teki karakterdir (5. karakterdir).

örnek dize: crt/r2002_2

İstediğim: crt/2002_2

Bu değiştirme işlevi her ikisini de kaldırır r

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

üretir: ct/2002_2

Bu işlevi denedim:

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

Yalnızca başka bir karakterle değiştirirsem çalışır. Sadece kaldırmayacak.

Düşüncesi olan var mı?


Burada sorun nedir, "r" -s kaldırıldı değil mi?
Vladimir Despotovic

Yanıtlar:


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

yerini alacak /rolan /kullanan String.prototype.replace.

Alternatif olarak, regex'i tüm olayları değiştirmek için küresel bir bayrakla ( aşağıdaki Erik Reppen ve Sagar Gala tarafından önerildiği gibi) kullanabilirsiniz.

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

DÜZENLEME: Herkes burada çok eğlendiğinden ve user1293504 açıklayıcı soruları cevaplamak için yakında geri dönmeyecek gibi görünüyor, Nth karakterini bir dizeden kaldırmak için bir yöntem var:

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 sıfır indeksli sayım yerine normal sayımı kullandığından, charAtçalışmaların 3. satırdaki dizinden 1 çıkarılmadığını ve tmp.splice(i, 1)bunun yerine nasıl kullanılamadığını çoğaltmak için bunu kullanmak istiyorsanız, dizinden 1'i kaldırmamız gerekir .


3
Dördüncü karakter mutlaka bir"/"
jak.b

74

Basit bir işlevsel javascript yolu olurdu

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

basit, hızlı, küresel olarak yerini alır ve işlevlere veya prototiplere gerek yoktur


3
Benim için harika çalışıyor. Ben mystring = mystring.replace ('/ r', '/') denerken; sadece ilk düzelticiyi dönüştürür, geri kalanı olduğu gibi.
rb vishnu

1
Bence bu en basit çözüm, çok basit ve bunun için normal ifadeyi bilmenize gerek yok!
Ticari İntihar

2
Dördüncü karakter mutlaka bir'/'
jak.b

1
Yine de testlere göre ( stackoverflow.com/questions/50463850/… ) yüksek bir performans (saniyede 10k işlem) javascript yazmadığınız sürece performans farkı bir sorun veya "ödeme için yüksek fiyat" değildir, bu yüzden yorumunuzu tam olarak nasıl görmüyorum çözüme katkıda bulunma
Strife86

Verimsiz olmanın yanı sıra (ve bunun gibi bir işlev, önemli olduğu uzun listelerde yinelemeli olarak kullanılabilir), OP'nin önceki karaktere değil, dizine bağlı sorusuna cevap vermez.
aamarks

49

Her zaman dize işlevleri vardır, her zaman dördüncü karakteri kaldıracağınızı biliyorsanız:

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

İlk veya son karakteri kaldırırken bu çalışmaz
TekTimmy

3
@TekTimmy Neden olmasın? str.slice(0, 0) + str.slice(1, str.length)ilkini str.slice(0, str.length-1) + str.slice(str.length, str.length)kaldırır, sonuncuyu kaldırır. (Tabii ki her zaman ilk veya sonuncuyu kaldırdığınızı biliyorsanız yedek parçaları kaldırabilirsiniz, ancak değişkenler ise diğer tüm dizinlerde olduğu gibi çalışırlar.)
JJJ

30

İlk fonksun neredeyse haklı. 'Global' (düzenle) anlamına gelen 'g' bayrağını kaldırın ve ikinci 'r' yi tespit etmek için bir bağlam verin.

Düzenleme: daha önce ikinci 'r' olduğunu görmedim, bu yüzden '/' eklendi. Bir regEx arg kullanırken '/' karakterinden kaçmak için \ / gerekir. Upvotes için teşekkürler ama yanıldım, bu yüzden regEx'in temellerini daha iyi anlamak isteyen insanlar için daha fazla ayrıntı ekleyeceğim ve düzelteceğim ama bu işe yarayacak:

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

Şimdi aşırı açıklama için:

Bir regEx kalıbını okurken / yazarken: <a karakter veya karakter kümesi> ardından <a karakter veya karakter kümesi> ve ardından <...

RegEx <a karakterinde veya karakter kümesinde> birer birer olabilir:

/each char in this pattern/

Bu yüzden e, ardından a, ardından c vb.

Veya tek bir <a karakter veya karakter kümesi> bir karakter sınıfı tarafından tanımlanan karakterler olabilir:

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

Veya bir miktar karakteri eşleştirmek için genişletildi (ancak sıralı desen açısından tek bir öğe olarak düşünmek en iyisi):

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

Bu yüzden bir grup birlikte söyle:

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

Ve tabii ki aşırı detaylandırdım ama benim açımdan basitçe:

/cat/

3 desen öğesinden oluşan bir dizidir (bir şeyi izleyen bir şeyi izleyen bir şey).

Ve bu da:

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

RegEx bakmaya başladığında, hepsi birbirini takip eden bir dizi şeye (potansiyel olarak çok karakterli şeyler) ayrılır. Tür temel bir nokta ama geçmiş almak için biraz zaman aldı bir yüzden bu yüzden burada OP açıklayan ve ben regEx için yeni neler yardımcı olur regEx yardımcı olacağını düşünüyorum denize açık gitti. RegEx'i okumanın / yazmanın anahtarı onu bu parçalara ayırmaktır.


13

'/ R' nin küresel olarak değiştirilmesi için bu kod benim için çalıştı.

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

8

Sadece düzelt replaceAt:

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

mystring.replaceAt(4, 1);

Bunun removeAtyerine onu ararım . :)


1
Bu aslında OP'nin problemini çözüyor ve neredeyse hiç oy almıyorken, en iyi iki cevap orijinal soruyu çözmüyor!
aamarks

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

char.lengthsıfırdır. 1Karakter atlamak için bu durumda eklemeniz gerekir .


Bu, sorulan soruya cevap vermiyor; sadece neden replaceAtçalışmadığını açıklar . Cevap yerine asıl soruya bir yorum olmalıdır. :)
Ken White

@KenWhite, infact tek soruyu cevaplıyor Any thoughts?.
Ash Burlaczenko

Yeterince adil. Katılmıyorum, ama ... :) İntikam almadım, ama bir cevap olarak nitelendirilmediğini sanmıyorum. Bir cevap, soruna bir çözüm sağlayabilir veya en azından daha ayrıntılı olarak açıklayabilir ve nasıl düzeltileceği hakkında bir fikir sunacaktır.
Ken White

@KenWhite, katılıyorum, sadece OP'nin sorusunu daha açık hale getirebileceği noktasını mı söylüyordum? Bazı insanlar sadece cevap vermek yerine sadece bir yöne işaret etmek isterler.
Ash Burlaczenko

1
@Paislee için +1 - bu yanıt yardımcı olmuyor çünkü JavaScript'te karakter olarak bir şey yok.
simpleigh

2

Dizinizdeki her zaman 4. karakter ise deneyebilirsiniz:

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

2

Yalnızca başka bir karakterle değiştirirsem çalışır. Sadece kaldırmayacak.

Bunun nedeni char, eşit olduğunda "", char.length0 olmasıdır, bu nedenle alt dizeleriniz orijinal dizeyi oluşturmak için birleşir. Kod denemenize bağlı olarak, aşağıdakiler işe yarayacaktır:

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

Aşağıdaki gibi bir işlev oluşturun

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

Değiştirmek için aşağıdaki gibi karakter verin

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

resim açıklamasını buraya girin

ve belirli dizindeki karakteri kaldırmak için ikinci parametreyi boş dize olarak verin

a.replaceAt(4,'');

resim açıklamasını buraya girin


2

Yalnızca tek bir karakteri kaldırmak istiyorsanız ve kaldırmak istediğiniz karakterin dizinini biliyorsanız, aşağıdaki işlevi kullanabilirsiniz:

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

1

Dizeden karakter kaldırmak için replace işlevini kullanarak sevmiyorum. Bunu böyle yapmak mantıklı değil . Genellikle C # (Sharp) programlıyorum ve karakterleri dizeden kaldırmak istediğimde, String sınıfının Remove yöntemini kullanıyorum, ancak var olmasına rağmen Replace yöntemini kullanmıyorum, çünkü kaldırmak üzereyken kaldırıyorum, yerine. Bu mantıklı!

Javascript'te dize için kaldırma işlevi yoktur, ancak substr işlevi vardır. Dizeden karakterleri kaldırmak için substr işlevini bir veya iki kez kullanabilirsiniz. C # yönteminin ilk aşırı String.Remove (int startIndex) gibi, başlangıç ​​dizinindeki karakterleri dizenin sonuna kadar kaldırmak için aşağıdaki işlevi yapabilirsiniz:

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

ve / veya c # yönteminin ikinci aşırı yükü String.Remove (int startIndex, int count) gibi başlangıç ​​indeksi ve sayımındaki karakterleri kaldırmak için aşağıdaki işlevi de yapabilirsiniz:

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

ve sonra bu iki işlevi veya bunlardan birini ihtiyaçlarınız için kullanabilirsiniz!

Misal:

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

Çıktı: crt / 2002_2

İle tekniklerini yaparak hedeflerine ulaşmak hiçbir mantığı kod anlamada kudreti neden karışıklıkları ve gelecek hataları, büyük bir projede bu çok yaparsanız!


2
Ben yabancı yöntemleri tanıtmak sadece String.prototype.replaceAPI, bir parçası olan sadece kullanarak , daha karmaşık olduğunu söyleyebilirim . Ayrıca, kaldırmanın özel bir değiştirme durumu olarak anlaşılması, programlama kadar oldukça mantıklıdır. API'nizin İngilizce sözlükteki tüm kelimeleri içermesini sağlamaya çalışmamalısınız, API'nizi minimum dikey tabanına indirmeye çalışmalısınız.
Witiko

1

Benim durumum için aşağıdaki işlev en iyi şekilde çalıştı:

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

1

En kısa yol splice kullanmak olacaktır

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

Ekleme orijinal diziyi değiştirir ve yalnızca etkilenen öğeleri döndürür. Diziler sıfır indekslendiğinden, bu örnek "" döndürür (dizideki 3. öğe ve ile arasındaki boşluk olduğu ciçin ")
JKirchartz

1

Bunu kullanabilirsiniz: if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

Açıklama:

  1. if ( str[4] === 'r' )
    5. karakterin bir 'r'

  2. str.slice(0, 4)
    Önce her şeyi almak için dize dilim 'r'

  3. + str.slice(5)
    Dizenin geri kalanını ekleyin.

Minimize edilmiş: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 bayt!]

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

Bu basit cevapın geliştirilmesidir (atlama uzunluğu)

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


-1

C # (Keskin) 'de boş bir karakter' \ 0 'yapabilirsiniz. Belki bunu yapabilirsiniz:

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

Google'da arama yapın veya interent üzerinde gezinin ve javascript'in C # gibi boş karakterler yapmanıza izin verip vermediğini kontrol edin. Evetse, nasıl yapılacağını öğrenin ve belki replaceAt işlevi sonunda çalışacaktır ve istediğinizi elde edeceksiniz!

Sonunda bu 'r' karakteri kaldırılacak!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.