2012-03-29 40 views
194

Tôi rất gần với việc này, nhưng nó không đúng. Tất cả những gì tôi muốn làm là xóa ký tự "r" khỏi chuỗi. Vấn đề là, có nhiều hơn một trường hợp "r" trong chuỗi. Tuy nhiên, nó luôn là ký tự thứ 4.Làm cách nào để xóa ký tự khỏi chuỗi bằng Javascript?

dụ chuỗi: "crt/r2002_2" Những gì tôi muốn: "crt/2002_2"

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

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

Tạo: "ct/2002_2"

tôi đã cố gắng 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ó với một nhân vật khác. Nó sẽ không đơn giản loại bỏ nó.

Mọi suy nghĩ?

+0

mô hình là gì? Bạn có muốn xóa char đầu tiên sau dấu gạch chéo không? –

+0

thay thế "r2002" bằng "2002" –

+0

Có string.replaceAt ('r') thay thế phiên bản đầu tiên của 'r' trong chuỗi? – Kailas

Trả lời

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

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

+0

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

+0

@KenWhite, infact nó trả lời câu hỏi duy nhất hỏi, "Bất kỳ suy nghĩ?'. –

+1

Theo như tôi biết không có sự khác biệt giữa một String và Char trong JS .. – paislee

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

sẽ thay thế /r với / sử dụng String.prototype.replace.

Hoặc bạn có thể sử dụng regex (với một lá cờ toàn cầu (theo đề nghị của Erik Reppen & Sagar Gala, bên dưới)) để thay thế tất cả các lần xuất hiện với

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

Ồ vâng, duh. Cảm ơn bạn! Rất nhiều câu trả lời tuyệt vời ở đây, và nhiều câu trả lời sẽ hoạt động. Đây là cách dễ nhất cho những gì tôi cần. – user1293504

+3

@ user1293504, nếu điều này trả lời câu hỏi của bạn, bạn nên chấp nhận câu hỏi đó. Điều này cho phép người khác biết vấn đề của bạn đã được giải quyết.Để biết thông tin về việc chấp nhận, hãy đọc [FAQ] (http://stackoverflow.com/faq) và để biết thông tin về lý do bạn nên đọc [meta post] này (http://meta.stackexchange.com/questions/ 5234/how-does-accepting-an-answer-work). Cảm ơn. :) –

+1

Tôi không biết. Tôi chỉ dừng lại để xem câu trả lời cuối cùng đã được chấp nhận, và nhận thấy rằng không ai có được; sau đó tôi thấy nhận xét của câu trả lời này từ OP, và tôi nghĩ tôi sẽ từ chối lời nhắc. (Tôi cũng upvoted trong khi tôi đã ở đây, trong khi câu trả lời của tôi hoạt động, bạn trực tiếp trả lời câu hỏi.) –

38

Luôn luôn có các chức năng chuỗi, nếu bạn biết bạn luôn sẽ loại bỏ các ký tự thứ tư:

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

Nếu nó luô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ế bằng ký tự khác. Nó sẽ không đơn giản loại bỏ nó.

Điều này là do khi char bằng "", char.length là 0, vì vậy chuỗi con của bạn kết hợp để tạo thành chuỗi gốc. Đi với nỗ lực mã của bạn, sau đây sẽ làm việc:

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

Chỉ cần sửa chữa 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 muốn gọi nó là removeAt để thay thế. :)

21

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

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

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

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

Khi đọc/viết một mẫu regex nghĩ về: < một nhân vật hay tập hợp các charcters > tiếp theo < một nhân vật hay tập hợp các charcters > tiếp theo < ...

trong regex < một nhân vật hay tập hợp các charcters > có thể cùng một lúc:

/each char in this pattern/ 

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

Hoặc một đơn < một nhân vật hoặc bộ charcters > có thể được nhân vật được mô tả bởi một lớp nhân vật:

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

Hoặc mở rộng trên để phù hợp với một số lượng ký tự (nhưng vẫn tốt nhất để nghĩ đến như là một yếu tố duy nhất trong điều khoản của patter tuần tự n):

/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à dĩ nhiên là tôi đã quá xây dựng nhưng quan điểm của tôi chỉ đơn giản rằng đây:

/cat/ 

là một loạt của 3 yếu tố mô hình (một điều theo sau là một điều theo sau là một điều).

Và như vậy là thế này:

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

Như lập dị như regex bắt đầu tìm kiếm, tất cả vỡ xuống hàng loạt của sự vật (khả năng đa nhân vật thứ) sau mỗi tuần tự khác. Loại điểm cơ bản nhưng một trong đó đã cho tôi một thời gian để có được quá khứ vì vậy tôi đã đi overboard giải thích nó ở đây như tôi nghĩ rằng đó là một trong đó sẽ giúp OP và những người khác mới để regEx hiểu những gì đang xảy ra. Chìa khóa để đọc/viết regEx là phá vỡ nó thành những phần.

6

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

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

Tôi không thích sử dụng hàm thay thế để xóa ký tự khỏi chuỗi. Điều này không hợp lý để thực hiện điều đó. 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 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 Replace, 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ó hàm xóa cho chuỗi, nhưng có hàm nền. Bạn có thể sử dụng hàm nền một lần hoặc hai lần để xóa các ký tự khỏi chuỗi. Bạn có thể thực hiện các chức năng sau để loại bỏ ký tự ở chỉ số bắt đầu đến khi kết thúc chuỗi, giống như C# phương pháp đầu tiên quá tải String.Remove (int startIndex):

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

và/hoặc bạn cũng có thể thực hiện các chức năng sau để loại bỏ ký tự ở chỉ số bắt đầu và đếm, giống như C# phương pháp thứ hai quá tải String.Remove (int startIndex, 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 hoặc một trong số họ cho các nhu cầu của bạn!

Ví dụ:

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

Output: crt/2002_2

Đạt mục tiêu bằng cách thực hiện các kỹ thuật với không có logic có thể gây nhầm lẫn trong sự hiểu biết của mã này, và những 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 pháp không liên quan sẽ khó hiểu hơn nhiều khi chỉ sử dụng 'String.prototype.replace', một phần của API cơ sở. Hơn nữa, sự hiểu biết loại bỏ như là một trường hợp đặc biệt của thay thế là khá hợp lý như xa như lập trình đi. Bạn không nên cố gắng làm cho API của bạn 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 bạn xuống cơ sở trực giao tối thiểu của nó. – Witiko

1

Trong C# (Sharp), bạn có thể tạo ký tự trống là '\ 0'. 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 phép bạn thực hiện ký tự trống rỗng, như C# làm. Nếu có, sau đó tìm hiểu làm thế nào để làm điều đó, và có lẽ chức năng replaceAt sẽ làm việc 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!

36

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 cho các chức năng hay nguyên mẫu

+1

Nó hoạt động tuyệt vời cho tôi. Trong khi tôi thử mystring = mystring.replace ('/ r', '/'); nó chỉ chuyển đổi hiệu chỉnh đầu tiên, phần còn lại của chúng là như vậy. –

+0

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

Các vấn đề liên quan