2012-03-01 29 views

Trả lời

6

Hãy để tôi giải quyết những theo thứ tự ngược:

Những gì tôi đang làm sai?

Bạn muốn sử dụng +, không phải *. * có nghĩa là không hoặc nhiều hơn đối sánh, điều này không có ý nghĩa ở đây. + có nghĩa là một hoặc nhiều hơn đối sánh. Vì vậy:

"aaa\nbbb\nccc".replace(/.+/g, ".") 
// ".\n.\n." 

Cũng lưu ý rằng nếu bạn không sử dụng ^ hay $ (ví dụ đầu tiên của bạn), bạn không cần sửa đổi m (nhưng đó không phải là vấn đề với những gì bạn đã làm). Và bạn không cần ^ hoặc $.doesn't match newlines (điều mà tôi không biết trước khi trả lời câu hỏi này).

Tại sao javascript thay thế chức năng chuỗi làm điều này?

Tôi không có ý tưởng trần tục và hy vọng người khác làm.

Một lần nữa, bằng cách sử dụng *, bạn đang nói số không hoặc nhiều hơn đối sánh. Vì vậy, nó phù hợp với tất cả các nhân vật có liên quan, thay thế chúng bằng dấu chấm đầu tiên; sau đó nó khớp với các ký tự số không, thay thế chúng bằng một dấu chấm. Kết quả: Hai dấu chấm.

Bằng chứng:

Live copy | Live source

"aaa\nbbb\nccc".replace(/.*/g, function(m) { 
    console.log("m = '" + m + "'"); 
}); 

Đầu ra:

m = 'aaa' 
m = '' 
m = 'bbb' 
m = '' 
m = 'ccc' 
m = ''
+0

Tôi thích "Nguồn trực tiếp". Lời giải thích tuyệt vời. –

+0

Giải thích tuyệt vời, điều này xứng đáng là + a_lot. Không biết rằng '.' cũng không khớp với dòng mới. –

3

Hãy nhìn vào hướng dẫn này:

"aaa\nbbb\nccc".replace(/(.*)/gm, ".$1.") 

sản xuất:

".aaa... 
.bbb... 
.ccc..." 

.* trận aaa và thay thế nó bằng .aaa., sau đó nó khớp với một chuỗi rỗng và thay thế bằng ...

Các hành vi tương tự khi bạn thay thế .* bởi .

Như đã nói T.J.Thay vào đó, sử dụng tên miền này: .+

"aaa\nbbb\nccc".replace(/.+/g, ".") 
1

Đáng ngạc nhiên, hành vi được mong đợi. Một chuỗi rỗng đáp ứng các biểu thức chính quy .*:

/.*/.test(""); 
// true 

/.*/.exec(""); 
// [""] 

Để hiểu những gì đang xảy ra, hãy chú ý đầu ra của:

"aaa\nbbb\nccc".match(/.*/g); 
// ["aaa", "", "bbb", "", "ccc", ""] 
// m flag dropped because^and $ are not used 

Giữ nhớ rằng . không phù hợp \n, trận đấu-thay thế được thực hiện như sau:

  • .* khớp với aaa
  • g cờ, chuỗi sau aaa được tìm kiếm một trận đấu
    • .* trận "" - một chuỗi số không dài sau aaa và trước \n
    • .* không phù hợp \n
    • .* trận bbb
    • .* khớp với "" - chuỗi có độ dài bằng không sau bbb và trước \n

Và cứ tiếp tục như vậy. Chỉ cần sử dụng .+ để tránh khớp các chuỗi trống.

+0

". * Không khớp \ n". Tốt để biết. –

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