2010-03-16 26 views

Trả lời

12

dot bắt tất cả mọi thứ ngoại trừ dòng mới .. (nếu dotall là sai)

do đó, hoặc sử dụng dotall (như đã đề cập trong câu trả lời khác/bình luận này không được hỗ trợ trong javascript, nhưng tôi sẽ để nó ở đây để tham khảo)

/\/\*(.*)\*\//gs 

hoặc thêm các ký tự khoảng trắng \s trong các biểu thức của bạn

/\/\*((\s|.)*?)\*\//g 

Alan nêu trong bình luận của ông một buổi biểu diễn xấu từ câu trả lời tôi đã vì vậy sử dụng sau đây thay vì .. (mà dịch để tất cả mọi thứ khoảng trắng và tất cả mọi thứ không khoảng trắng, vì vậy tất cả mọi thứ ..)

/\/\*([\s\S]*?)\*\//g 
+0

Không có s' (single-line) Chế độ 'trong JavaScript, và '(. \ S |)' tòa án thảm khốc quay lui. Cách tiêu chuẩn để so khớp mọi thứ bao gồm cả dòng mới trong JS là '[\ S \ s]'. –

+0

@alan, mọi liên kết về '\ s | .' backtracking? muốn tìm hiểu thêm về nó .. –

+1

Erik Corry đã giải thích rõ điều này tại đây: http://stackoverflow.com/questions/2407870/javascript-regex-hangs-using-v8/2408599#2408599 Để có một cuộc thảo luận tổng quát hơn về việc khắc phục hậu quả thảm khốc , xem http://www.regular-expressions.info/catastrophic.html –

4

Hai vấn đề:

  1. Trong javascript, không có sửa đổi dotall. Bạn sẽ phải sử dụng hack để cho phép các dòng mới phù hợp, chẳng hạn như sử dụng [^].
  2. Bạn đang sử dụng kết hợp tham lam. Nếu có nhiều ý kiến ​​trong đầu vào của bạn, mọi thứ giữa chúng sẽ được ăn.

Giải pháp:

/\/\*[^]*?\*\//g 

Ví dụ:

> '/*abc\ncde*/qqq/*iop\n\njj*/'.replace(/\/\*[^]*?\*\//g, '') 
qqq 
+1

+1, thay đổi để không tham lam .. –

+0

Không hoạt động với các nhận xét lồng nhau. Thử: '/ * abc/* xyz */def/*'. Bản chất không tham lam làm cho nó khớp với bình luận đầu tiên thứ nhất với chú thích cuối cùng, và sau đó chỉ còn lại 'def '. – InfinitiesLoop

+0

Đừng bận tâm, các bình luận lồng nhau không thực sự được cho phép theo cách đó. Cái bên trong sẽ chấm dứt cái bên ngoài. – InfinitiesLoop

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