2012-12-19 72 views
9

Tôi có chuỗi giống như sau: "Doe, John, A" (họ, tên, chữ đệm giữa).Regex thay thế tất cả dấu phẩy bằng giá trị

Tôi đang cố gắng viết cụm từ thông dụng chuyển đổi chuỗi thành "Doe * John * A".

Tuy nhiên, tôi phải tính đến tất cả các khoảng trống cho chuỗi này vì vậy "Doe, John, A" sẽ vẫn chuyển đổi thành "Doe * John * A".

CSONG, chuỗi "Doe John A" phải chuyển thành "Doe * John * A".

Tôi bắt đầu viết điều này, nhưng tôi nghĩ rằng tôi bị kẹt trên không gian & khả năng người dùng không cung cấp dấu phẩy.

Dưới đây là những gì tôi có:

var myString = "John, Doe, A"; 
var myOtherString = "John Doe A"; 


var myFunction = function (aString) { 
     aString = aString.replace(", ", "*"); 
     aString = aString.replace(", ", "*"); 

return aString; 

}; 

Những cả nên trở "Doe*John*A".

Tôi nghĩ rằng tôi đang lặp lại bản thân mình quá nhiều trong chức năng này. Tôi cũng không tính đến khả năng không có dấu phẩy nào được cung cấp.

Có cách nào tốt hơn để thực hiện việc này không?

Trả lời

14

Có, có. Thay vào đó hãy sử dụng hàm replace với regex. Điều đó có một vài lợi thế. Thứ nhất, bạn không cần phải gọi nó hai lần nữa. Thứ hai nó thực sự dễ dàng để giải thích cho một số tiền tùy ý của không gian và một dấu phẩy tùy chọn:

aString = aString.replace(/[ ]*,[ ]*|[ ]+/g, '*'); 

Lưu ý rằng các dấu ngoặc vuông xung quanh không gian là không bắt buộc, nhưng tôi thấy họ làm cho các nhân vật không gian dễ dàng dễ đọc hơn. Nếu bạn muốn cho phép/loại bỏ bất kỳ loại khoảng trắng ở đó (tab và ngắt dòng, quá), sử dụng \s thay vì:

aString = aString.replace(/\s*,\s*|\s+,/g, '*'); 

Lưu ý rằng trong cả hai trường hợp chúng ta không thể chỉ đơn giản là làm cho các dấu phẩy tùy chọn, bởi vì đó sẽ cho phép zero các trận đấu băng thông, sẽ giới thiệu một * ở mọi vị trí trong chuỗi. (Cảm ơn CruorVult đã chỉ ra điều này)

+0

' "Doe, John, A" .replace (/ \ s *, \ s */g, ' * '); // "* D * o * e ** J * o * h * n ** A *" ' – CruorVult

+0

@CruorNhững người cổ vũ, cố định –

+0

Nếu tôi muốn thay thế * s bằng dấu gạch ngang thì sao? Tôi chỉ cần thay đổi điều này thành 'aString = aString.replace (/ [] *, [] * | [] +/g, '-'); ? ' --Cảm ơn câu trả lời hữu ích, btw. – Jeff

2

String.replace chỉ thay thế lần xuất hiện đầu tiên. Để thay thế tất cả, hãy thêm cờ "g" cho "toàn cầu". Bạn cũng có thể sử dụng các nhóm nhân vật và các nhà điều hành + (một hoặc nhiều) để phù hợp với chuỗi ký tự:

aString.replace("[,\s]+", "*", "g"); 

này sẽ thay thế tất cả các chuỗi dấu phẩy và khoảng trắng với một *.

+2

một lần nữa, đây không phải là cách regex được viết và cách các công cụ sửa đổi được áp dụng trong javascript –

1

Hãy thử cách này để xóa tất cả dấu cách và dấu phẩy, sau đó thay bằng *.

Myname= myname.replace(/[,\s]/,"*")

ngồi biên tập như loại bỏ 'ít nhất hai mục' từ mẫu. Nhưng ít nhất phải có mặt hàng.

Myname= myname.replace(/([,\s]{1,})/,"*")

Reference: on Rublar. Tuy nhiên bạn tốt hơn với regexpal theo m.Buettner :)

+0

@ m.buettner cảm ơn vì đã viết ra lỗ vòng lặp :) – bonCodigo

+0

Bạn nên tạo "ít nhất một mục". Bây giờ bạn sẽ nhận được nhiều '*' khi bạn có dấu cách và dấu phẩy trước –

+0

@ m.buettner Ở đây tôi đã mệt mỏi [rublar] (http://rubular.com/r/6btBOKRqHy) – bonCodigo

5

Nếu bạn muốn thay thế tất cả các phi từ nhân vật thử điều này:

str.replace(/\W+/g, '*'); 
Các vấn đề liên quan