ฉันจะลบอักขระออกจากสตริงโดยใช้ Javascript ได้อย่างไร


362

ฉันใกล้จะได้มันแล้ว แต่มันก็ไม่ถูกต้อง ทั้งหมดที่ฉันต้องการจะทำคือลบตัวละคร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" -s ถูกลบไปหมดแล้วไม่ใช่เหรอ?
Vladimir Despotovic

คำตอบ:


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

จะเข้ามาแทนที่/rด้วยการใช้/String.prototype.replace

หรือคุณสามารถใช้ regex กับค่าสถานะโกลบอล (ตามที่Erik Reppen & Sagar Gala แนะนำด้านล่าง) เพื่อแทนที่การเกิดขึ้นทั้งหมดด้วย

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

แก้ไข: เนื่องจากทุกคนมีความสนุกสนานมากมายที่นี่และผู้ใช้1293504ดูเหมือนจะไม่กลับมาอีกเมื่อเร็ว ๆ นี้เพื่อตอบคำถามที่ชี้แจงนี่เป็นวิธีการลบอักขระ Nth ออกจากสตริง:

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

วิธีจาวาสคริปต์ที่ใช้งานง่ายจะเป็นเช่นนั้น

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

ง่ายรวดเร็วมันแทนที่ทั่วโลกและไม่จำเป็นต้องใช้ฟังก์ชั่นหรือต้นแบบ


3
มันใช้งานได้ดีสำหรับฉัน ขณะที่ฉันลอง mystring = mystring.replace ('/ r', '/'); มันแปลงเพียงแค่คอร์เรเตอร์ตัวแรกส่วนที่เหลือจะเป็นอย่างที่มันเป็น
rb vishnu

1
ฉันคิดว่ามันเป็นทางออกที่ดีที่สุดง่ายมากและคุณไม่จำเป็นต้องรู้ regex!
ฆ่าตัวตายในเชิงพาณิชย์

2
อักขระที่สี่ไม่จำเป็นต้องเป็น'/'
jak.b

1
อย่างไรก็ตามตามการทดสอบ ( stackoverflow.com/questions/50463850/ … ) เว้นแต่คุณจะเขียนประสิทธิภาพสูง (การดำเนินงาน 10k ต่อวินาที) จาวาสคริปต์ความแตกต่างของประสิทธิภาพไม่ใช่ปัญหาหรือ "ราคาสูงจ่าย" ดังนั้นฉันจึงไม่เห็นความคิดเห็นของคุณอย่างแน่นอน นำไปสู่การแก้ปัญหา
Strife86

นอกเหนือจากการไม่มีประสิทธิภาพ (และฟังก์ชั่นเช่นนี้อาจถูกนำมาใช้ซ้ำในรายการที่มีความยาว) ซึ่งไม่ได้ตอบคำถามของ OP ซึ่งขึ้นอยู่กับดัชนีไม่ใช่ตัวละครก่อนหน้า
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' ซึ่งย่อมาจาก 'global' (แก้ไข) และให้บริบทเพื่อระบุจุดที่สอง

แก้ไข: ไม่เห็นว่าเป็น 'r' ตัวที่สองก่อนเพิ่ม '/' ต้องการ \ / เพื่อหลีกเลี่ยง '/' เมื่อใช้งาน regEx ขอบคุณสำหรับ upvotes แต่ฉันผิดฉันจะแก้ไขและเพิ่มรายละเอียดเพิ่มเติมสำหรับผู้ที่สนใจในการทำความเข้าใจพื้นฐานของ regEx ให้ดีขึ้น แต่สิ่งนี้จะใช้ได้:

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

ตอนนี้สำหรับคำอธิบายที่มากเกินไป:

เมื่ออ่าน / เขียนรูปแบบ regEx ให้คำนึงถึง: <a character หรือชุด charcters> ตามด้วย <a character หรือชุด charcters> ตามด้วย <...

ในอักขระหรือชุดของ charcters <a regEx อาจมีทีละรายการ:

/each char in this pattern/

ดังนั้นอ่านด้วย e ตามด้วย a, ตามด้วย c, ฯลฯ ...

หรืออักขระหรือชุดอักขระ charcters> หนึ่งตัวอาจเป็นอักขระที่อธิบายโดยคลาสอักขระ:

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

ดังนั้น smoosh พวงกัน:

   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 เริ่มมองมันทั้งหมดแบ่งออกเป็นชุดของสิ่งต่าง ๆ เป็นจุดพื้นฐาน แต่เป็นสิ่งที่ทำให้ฉันผ่านไปได้สักระยะดังนั้นฉันจึงไปอธิบายที่นี่เพราะฉันคิดว่ามันเป็นสิ่งที่จะช่วยให้ OP และคนใหม่ ๆ ในการทำความเข้าใจกับสิ่งที่เกิดขึ้น กุญแจสำคัญในการอ่าน / เขียน regEx คือแบ่งมันออกเป็นส่วน ๆ



8

เพียงแก้ไขของคุณreplaceAt:

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

mystring.replaceAt(4, 1);

ฉันจะเรียกมัน removeAtแทน :)


1
นี่เป็นการแก้ปัญหาของ OP และแทบจะไม่ได้รับคะแนนใด ๆ ในขณะที่คำตอบสองข้อแรกไม่ได้แก้ปัญหาดั้งเดิม!
aamarks

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

char.lengthเป็นศูนย์ คุณต้องเพิ่ม1ในกรณีนี้เพื่อข้ามอักขระ


สิ่งนี้ไม่ตอบคำถามที่ถาม มันเพียงอธิบายว่าทำไมreplaceAtไม่ทำงาน ควรเป็นความเห็นต่อคำถามต้นฉบับแทนที่จะเป็นคำตอบ :)
Ken White

@KenWhite, infact มันไม่ตอบคำถามเพียง Any thoughts?แต่ถามว่า
Ash Burlaczenko

ยุติธรรมพอสมควร ฉันไม่เห็นด้วย แต่ ... :) ฉันไม่ได้ลงคะแนน แต่ฉันไม่คิดว่ามันจะถือว่าเป็นคำตอบ คำตอบจะให้วิธีการแก้ปัญหาหรืออย่างน้อยก็อธิบายรายละเอียดเพิ่มเติมและเสนอแนวคิดวิธีการแก้ไข
Ken White

@ KenWhite ฉันเห็นด้วยฉันแค่ทำให้ประเด็นที่ OP สามารถทำให้คำถามของเขาชัดเจนขึ้นได้หรือไม่ บางคนต้องการชี้ไปในทิศทางเดียวแทนที่จะได้รับคำตอบ
Ash Burlaczenko

1
+1 สำหรับ @paislee - คำตอบนี้ไม่มีประโยชน์เพราะไม่มีสิ่งใดในจาวาสคริปต์
simpleigh

2

ถ้ามันเป็นถ่านที่ 4 ในสายรัดของคุณคุณสามารถลอง:

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

สิ่งนี้จะไม่ทำงานในบางกรณี (เช่น index = 0)
Tomer

1

ฉันไม่ชอบการใช้ฟังก์ชั่นแทนที่เพื่อลบอักขระออกจากสตริง นี่ไม่ใช่เหตุผลที่จะทำอย่างนั้น ฉันมักจะเขียนโปรแกรมใน C # (ชาร์ป) และเมื่อใดก็ตามที่ฉันต้องการลบอักขระจากสตริงฉันใช้วิธีการลบของคลาส String แต่ไม่มีวิธีแทนที่แม้ว่าจะมีอยู่เพราะเมื่อฉันกำลังจะลบฉันจะลบ ไม่มีการแทนที่ นี่คือตรรกะ!

ใน Javascript ไม่มีฟังก์ชั่นลบสำหรับสตริง แต่มีฟังก์ชั่น substr คุณสามารถใช้ฟังก์ชัน substr หนึ่งหรือสองครั้งเพื่อลบอักขระออกจากสตริง คุณสามารถสร้างฟังก์ชั่นต่อไปนี้เพื่อลบตัวอักษรที่ดัชนีเริ่มต้นไปจนถึงจุดสิ้นสุดของสตริงเช่นเดียวกับวิธี c # ก่อนโอเวอร์โหลดสตริง String.Remove (int startIndex):

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

และ / หรือคุณสามารถสร้างฟังก์ชั่นต่อไปนี้เพื่อลบตัวอักษรที่ดัชนีเริ่มต้นและจำนวนเช่นเดียวกับ c # วิธีที่สองเกินพิกัด String.Remove (int startIndex, int นับ):

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

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

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)
    เพิ่มส่วนที่เหลือของสตริง

ย่อขนาด: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 bytes!]

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 และตรวจสอบว่าจาวาสคริปต์อนุญาตให้คุณสร้างตัวอักษรว่างเปล่าเช่น C # หรือไม่ ถ้าใช่เรียนรู้วิธีการทำและบางทีฟังก์ชัน replaceAt จะใช้งานได้ในที่สุดและคุณจะบรรลุสิ่งที่คุณต้องการ!

ในที่สุดตัวละคร 'r' จะถูกลบออก!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.