Làm cách nào để xóa ký tự khỏi chuỗi bằng Javascript?


363

Tôi rất gần để có được điều này, nhưng nó không đúng. Tất cả những gì tôi muốn làm là loại bỏ ký tự rkhỏi một chuỗi. Vấn đề là, có nhiều hơn một thể hiện rtrong chuỗi. Tuy nhiên, nó luôn là ký tự ở chỉ số 4 (vì vậy là ký tự thứ 5).

chuỗi ví dụ: crt/r2002_2

Những gì tôi muốn: crt/2002_2

Chức năng thay thế này loại bỏ cả hai r

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

Sản xuất: ct/2002_2

Tôi đã thử chức năng này:

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

Nó chỉ hoạt động nếu tôi thay thế nó bằng một nhân vật khác. Nó sẽ không chỉ đơn giản là loại bỏ nó.

Có suy nghĩ gì không?


Có vấn đề gì ở đây, "r" -s đã bị xóa hết phải không?
Vladimir Despotovic

Câu trả lời:


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

sẽ thay thế /rbằng /việc sử dụng String.prototype.replace.

Ngoài ra, bạn có thể sử dụng regex với cờ toàn cầu (như được đề xuất bởi Erik Reppen & Sagar Gala , bên dưới) để thay thế tất cả các lần xuất hiện bằng

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

EDIT: Vì mọi người đang có rất nhiều niềm vui ở đây và user1293504 dường như sẽ không quay lại bất cứ lúc nào để trả lời các câu hỏi làm rõ, đây là một phương pháp để loại bỏ ký tự thứ N khỏi chuỗi:

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

Vì user1293504 đã sử dụng số đếm bình thường thay vì số không có chỉ số, chúng tôi phải xóa 1 khỏi chỉ mục, nếu bạn muốn sử dụng số này để sao chép cách thức charAthoạt động không trừ 1 từ chỉ mục trên dòng thứ 3 và sử dụng tmp.splice(i, 1)thay thế.


3
Nhân vật thứ tư không nhất thiết phải là một"/"
jak.b

74

Một cách javascript chức năng đơn giản sẽ là

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

đơn giản, nhanh chóng, nó thay thế toàn cầu và không cần chức năng hoặc nguyên mẫu


3
Đó là công việc tốt cho tôi. Trong khi tôi thử mystring = mystring.replace ('/ r', '/'); nó chỉ chuyển đổi bộ sửa lỗi đầu tiên, phần còn lại của chúng là như vậy.
rb vishnu

1
Tôi nghĩ đó là giải pháp tốt nhất, rất đơn giản và bạn không cần biết regex cho nó!
Tự tử thương mại

2
Nhân vật thứ tư không nhất thiết phải là một'/'
jak.b

1
dù sao theo các thử nghiệm ( stackoverflow.com/questions/50463850/, ) trừ khi bạn đang viết một javascript hiệu suất cao (hoạt động 10k mỗi giây), sự khác biệt về hiệu suất không phải là vấn đề hay "giá cao phải trả" vì vậy tôi không thấy chính xác nhận xét của bạn như thế nào đóng góp cho giải pháp
Strife86

Ngoài việc không hiệu quả (và một chức năng như thế này có thể được sử dụng lặp đi lặp lại trong danh sách dài khi có vấn đề), điều này không trả lời câu hỏi của OP phụ thuộc vào chỉ mục, không phụ thuộc vào ký tự trước.
aamarks

49

Luôn có các hàm chuỗi, nếu bạn biết bạn sẽ luôn xóa ký tự thứ tư:

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

Điều này không hoạt động khi xóa ký tự đầu tiên hoặc cuối cùng
TekTimmy 15/03/18

3
@TekTimmy Tại sao không? str.slice(0, 0) + str.slice(1, str.length)loại bỏ cái đầu tiên và str.slice(0, str.length-1) + str.slice(str.length, str.length)loại bỏ cái cuối cùng (Tất nhiên bạn sẽ loại bỏ các phần dư thừa nếu bạn biết bạn luôn xóa phần đầu tiên hoặc phần cuối, nhưng nếu chúng là biến thì chúng hoạt động tốt như mọi chỉ mục khác.)
JJJ

30

Func đầu tiên của bạn là gần như đúng. Chỉ cần xóa cờ 'g' là viết tắt của 'toàn cầu' (chỉnh sửa) và cung cấp cho nó một số bối cảnh để phát hiện ra 'r' thứ hai.

Chỉnh sửa: không thấy đó là 'r' thứ hai trước khi thêm '/'. Cần \ / để thoát '/' khi sử dụng đối số regEx. Cảm ơn các upvote nhưng tôi đã sai nên tôi sẽ sửa chữa và thêm chi tiết cho những người quan tâm tìm hiểu cơ bản về regEx tốt hơn nhưng điều này sẽ hoạt động:

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

Bây giờ cho lời giải thích quá mức:

Khi đọc / viết một mẫu regEx, hãy nghĩ theo các khía cạnh: <a character hoặc set charcters> theo sau là <a character hoặc set charcters> theo sau là <...

Trong regEx <a ký tự hoặc bộ charcters> có thể là một lần:

/each char in this pattern/

Vì vậy, đọc như e, theo sau là a, tiếp theo là c, v.v ...

Hoặc một ký tự <a hoặc bộ charcters> có thể là các ký tự được mô tả bởi một lớp ký tự:

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

Hoặc được mở rộng để phù hợp với số lượng ký tự (nhưng vẫn tốt nhất để nghĩ là một yếu tố duy nhất theo mô hình tuần tự):

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

Vì vậy, smoosh một bó với nhau:

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

Và tất nhiên tôi đã xây dựng quá mức nhưng quan điểm của tôi chỉ đơn giản là thế này:

/cat/

là một chuỗi gồm 3 yếu tố mẫu (một thứ theo sau là một thứ).

Và đây là:

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

Khi lập dị như regEx bắt đầu tìm kiếm, tất cả đều chia thành hàng loạt thứ (có khả năng là nhiều thứ) theo sau nhau. Một điểm cơ bản nhưng một điểm khiến tôi mất một thời gian để vượt qua vì vậy tôi đã quá nhiệt tình giải thích nó ở đây vì tôi nghĩ đó là một điểm sẽ giúp OP và những người khác mới biết regEx hiểu những gì đang diễn ra. Chìa khóa để đọc / ghi regEx là chia nó thành các phần.


13

Để thay thế toàn cầu '/ r', mã này hoạt động với tôi.

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

8

Chỉ cần sửa lỗi của bạn replaceAt:

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

mystring.replaceAt(4, 1);

Tôi sẽ gọi nó removeAtthay thế. :)


1
Điều này thực sự giải quyết vấn đề của OP và hầu như không nhận được bất kỳ phiếu bầu nào, trong khi hai câu trả lời hàng đầu không giải quyết được câu hỏi ban đầu!
aamarks

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

char.lengthbằng không. Bạn cần thêm 1vào trong trường hợp này để bỏ qua ký tự.


Điều này không trả lời câu hỏi được hỏi; nó chỉ đơn giản giải thích tại sao replaceAtkhông hoạt động. Nó nên là một bình luận cho câu hỏi ban đầu thay vì một câu trả lời. :)
Ken White

@KenWhite, nguyên vẹn nó trả lời câu hỏi duy nhất , Any thoughts?.
Ash Burlaczenko

Đủ công bằng. Tôi không đồng ý, nhưng ... :) Tôi không đánh giá thấp, nhưng tôi không nghĩ nó đủ điều kiện để trả lời. Một câu trả lời sẽ cung cấp một giải pháp cho vấn đề, hoặc ít nhất là giải thích chi tiết hơn và đưa ra ý tưởng về cách khắc phục nó.
Ken White

@KenWhite, tôi đồng ý, tôi chỉ đưa ra quan điểm rằng OP có thể làm cho câu hỏi của anh ấy rõ ràng hơn? Một số người chỉ muốn chỉ theo một hướng chứ không chỉ đưa ra câu trả lời.
Ash Burlaczenko

1
+1 cho @paislee - câu trả lời này không hữu ích vì không có thứ gọi là char trong JavaScript.
đơn giản

2

Nếu nó luôn là char thứ 4 trong yourString, bạn có thể thử:

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

2

Nó chỉ hoạt động nếu tôi thay thế nó bằng một nhân vật khác. Nó sẽ không chỉ đơn giản là loại bỏ nó.

Đó là bởi vì khi char bằng "", char.lengthlà 0, vì vậy các chuỗi con của bạn kết hợp để tạo thành chuỗi ban đầu. Thực hiện với nỗ lực mã của bạn, sau đây sẽ hoạt động:

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

Tạo chức năng như dưới đây

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

Để thay thế cho nhân vật như dưới đây

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

nhập mô tả hình ảnh ở đây

và để loại bỏ ký tự ở chỉ mục xác định, đưa tham số thứ hai dưới dạng chuỗi rỗng

a.replaceAt(4,'');

nhập mô tả hình ảnh ở đây


2

Nếu bạn chỉ muốn xóa một ký tự và Nếu bạn biết chỉ mục của một ký tự bạn muốn xóa, bạn có thể sử dụng chức năng sau:

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

Điều này sẽ không hoạt động trong một số trường hợp (ví dụ: index = 0).
Tomer

1

Tôi không thích sử dụng chức năng thay thế để loại bỏ các ký tự khỏi chuỗi. Điều này là không hợp lý để làm điều đó như thế. Thông thường tôi lập trình trong C # (Sharp) và bất cứ khi nào tôi muốn xóa các ký tự khỏi chuỗi, tôi sử dụng phương thức Remove của lớp String, nhưng không có phương thức Thay thế, mặc dù nó tồn tại, bởi vì khi tôi sắp xóa, tôi xóa, không thay thế. Điều này là hợp lý!

Trong Javascript, không có chức năng loại bỏ cho chuỗi, nhưng có chức năng cơ sở. Bạn có thể sử dụng hàm đế một hoặc hai lần để xóa các ký tự khỏi chuỗi. Bạn có thể thực hiện chức năng sau để xóa các ký tự ở chỉ mục bắt đầu đến cuối chuỗi, giống như phương thức c # đầu tiên quá tải String.Remove (int start Index):

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

và / hoặc bạn cũng có thể tạo hàm sau để xóa các ký tự ở chỉ mục bắt đầu và đếm, giống như phương thức thứ hai của phương thức c # String.Remove (int start Index, int Count):

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

và sau đó bạn có thể sử dụng hai chức năng này hoặc một trong số chúng cho nhu cầu của bạn!

Thí dụ:

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

Đầu ra: crt / 2002_2

Đạt được các mục tiêu bằng cách thực hiện các kỹ thuật không có logic có thể gây ra sự nhầm lẫn trong việc hiểu mã và các sai lầm trong tương lai, nếu bạn làm điều này rất nhiều trong một dự án lớn!


2
Tôi muốn nói rằng việc giới thiệu các phương thức không liên quan sẽ khó hiểu hơn nhiều khi chỉ sử dụng String.prototype.replace, đó là một phần của API cơ sở. Hơn nữa, hiểu loại bỏ như là một trường hợp đặc biệt của sự thay thế là khá hợp lý theo như lập trình. Bạn không nên cố gắng làm cho API của mình bao gồm tất cả các từ trong từ điển tiếng Anh, bạn nên cố gắng giảm API của mình xuống cơ sở trực giao tối thiểu của nó.
Witiko

1

Các chức năng sau đây hoạt động tốt nhất cho trường hợp của tôi:

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

1

Cách ngắn nhất là sử dụng mối nối

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 làm thay đổi mảng ban đầu và chỉ trả về các phần tử được thực hiện. Vì các mảng được lập chỉ mục bằng 0, ví dụ này sẽ trả về "" (vì phần tử thứ 3 trong mảng là khoảng trống giữa c")
JKirchartz

1

Bạn có thể sử dụng điều này: if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

Giải trình:

  1. if ( str[4] === 'r' )
    Kiểm tra xem ký tự thứ 5 có phải là một 'r'

  2. str.slice(0, 4)
    Cắt chuỗi để có được mọi thứ trước 'r'

  3. + str.slice(5)
    Thêm phần còn lại của chuỗi.

Thu nhỏ: 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)


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


-1

Trong C # (Sắc nét), bạn có thể tạo một ký tự trống là '\ 0'. Có lẽ bạn có thể làm điều này:

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

Tìm kiếm trên google hoặc lướt trên interent và kiểm tra xem javascript có cho phép bạn tạo các ký tự trống không, giống như C # không. Nếu có, sau đó tìm hiểu cách thực hiện và có thể chức năng thay thế sẽ hoạt động cuối cùng và bạn sẽ đạt được những gì bạn muốn!

Cuối cùng, ký tự 'r' sẽ bị xóa!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.