2009-12-27 27 views
106

Tôi có điều nàyTại sao javascript chỉ thay thế trường hợp đầu tiên khi sử dụng thay thế?

var date = $('#Date').val(); 

này nhận được giá trị trong hộp văn bản gì sẽ trông như thế này

12/31/2009

Bây giờ tôi làm điều này trên nó

var id = 'c_' + date.replace("/", ''); 

và kết quả là

c_1231/2009

Nó bỏ lỡ '/' cuối cùng tôi không hiểu tại sao.

+0

chỉnh sửa tiêu đề để mô tả ít hơn một chút, nhưng đó là câu hỏi của bạn, vì vậy bạn là sếp. : D –

+1

Bản sao có thể có của [Thay thế tất cả các lần xuất hiện của một chuỗi trong JavaScript] (http://stackoverflow.com/questions/1144783/replacing-all-occurrences-of-a-string-in-javascript) – chharvey

+0

Điều này thật đau đớn và không cần thiết. Tôi tự hỏi lý do gì để thực hiện 'thay thế' như thế này. Tôi thậm chí còn chọn 'str.split (tìm kiếm) .join (thay thế)' trên regexp. –

Trả lời

193

Bạn cần phải đặt g flag để thay thế toàn cầu:

date.replace(new RegExp("/", "g"), '') 
// or 
date.replace(/\//g, '') 

Nếu không chỉ sự xuất hiện đầu tiên sẽ được thay thế.

+0

Tại sao sự khác biệt thì C# thay thế. Nghĩ rằng nó sẽ thay thế tất cả các lần xuất hiện theo mặc định. Nhưng tại sao nó mất 2 dấu gạch ngang nếu nó chỉ là lần xuất hiện đầu tiên? – chobo2

+2

@ chobo2 nó không lấy đi hai dấu gạch chéo. Chỉ có hai để bắt đầu, và nó đã loại bỏ cái đầu tiên. –

+4

@ chobo2: Vâng, JavaScript không phải là C#. Và '12/31/2009' chỉ chứa hai dấu gạch chéo. – Gumbo

65

Không giống như thư viện lớp C# /. NET (và hầu hết các ngôn ngữ hợp lý khác), khi bạn chuyển một đối số chuỗi để đối sánh với phương thức string.replace, nó không thay thế chuỗi. Nó chuyển đổi chuỗi thành RegExp và thực hiện thay thế regex. Như Gumbo giải thích, thay thế regex yêu cầu cờ‍lobal, không được bật theo mặc định, để thay thế tất cả các kết quả phù hợp trong một lần.

Nếu bạn muốn có một chuỗi dựa trên thực thay thế - ví dụ bởi vì trận đấu dây là năng động và có thể chứa các ký tự mà có một ý nghĩa đặc biệt trong regexen - thành ngữ JavaScript cho đó là:

var id= 'c_'+date.split('/').join(''); 
+2

Nếu bạn muốn thực sự đẩy loại chức năng này, bạn có thể thử một cái gì đó như 'String.prototype.strReplace = function (kim, thay thế) {return this.split (kim) .join (thay thế ||" ");}; 'Sau đó, bạn có thể' var id = "c_" + date.strReplace ("/") ' – Patrick

+0

Tôi thích giải thích về điều này tốt hơn so với bất kỳ câu trả lời nào khác cho các câu hỏi tương tự. Câu trả lời được chấp nhận chỉ cung cấp cách giải quyết, không phải là câu trả lời cho 'Tại sao' như trong tiêu đề. – JakeJ

+0

Điều này dường như chỉ làm việc trên hai trường hợp đầu tiên của chuỗi tìm kiếm của tôi ... tất cả những người khác bị bỏ qua ... ?? (Liệu nó có phải là trường hợp tìm kiếm của tôi có nhiều ký tự không? –

5

Bạn có thể sử dụng:

String.prototype.replaceAll = function(search, replace) { 
if (replace === undefined) { 
    return this.toString(); 
} 
return this.split(search).join(replace); 
} 
Các vấn đề liên quan