2013-07-28 32 views
14

Trong Internet Explorer 10, điều này:/.?e.?/ phù hợp với toàn bộ chuỗi, chứ không phải là dự kiến ​​chuỗi

'abcdefghi'.match(/.?e.?/) 

đánh giá để ['def'], như tôi mong đợi, nhưng trong Firefox 21.0, nó để đánh giá ['abcdefghi']. (Xem this jsFiddle.) Tôi nhận được cùng một kiểu hành vi không mong muốn đối với một số regex khác nhất định bắt đầu và kết thúc bằng nội dung tùy chọn, chẳng hạn như /.?e.{0,2}//.{0,2}e.{0,2}/; tuy nhiên, những người nhận xét chỉ ra các chế độ tương tự nhau, chẳng hạn như /\S?e\S?//(?:.?e.?)/, là không bị ảnh hưởng bởi. Điều tương tự cũng áp dụng cho phương pháp replace.

Tôi có thiếu thứ gì đó hiển nhiên không? Có một số lý do sâu sắc cho hành vi này?

+0

Cũng trong chrome của nó: 'e de ef cdef' +1 cho cái này. –

+1

Vâng, thêm một nhóm có vẻ * sửa * nó: ''abcdefghi'.match (/ (?:.? E.?) /)'. Nhưng, tôi đoán lỗi. –

+0

Vấn đề tương tự xuất hiện trong Firefox 22, nhưng cần lưu ý rằng '/.?.?/' hoạt động đúng, cũng như '/ e.? /' Và '/.? E /' – SheetJS

Trả lời

6

Như tiffon đã nói, đây là một lỗi trong SpiderMonkey (công cụ JavaScript của Firefox).

Trong SpiderMonkey, chúng tôi sử dụng công cụ RegExp từ công cụ JavaScriptCore JS của Safari và kế thừa lỗi từ đó. Tôi đã nộp bug 119191 cho lỗi trong Công ty Cổ phần.

2

Trông giống như một lỗi. Tôi đã nộp an issue.

Btw, tiền phạt công việc sau đây:

'abcdefghi'.match(/.e./) 
'abcdefghi'.match(/.e.?/) 
'abcdefghi'.match(/.?e./) 
'abcdefghi'.match(/[a-z]?e.?/) 
'abcdefghi'.match(/.?e[a-z]?/) 

http://jsfiddle.net/afDqC/1/

+0

+1, cảm ơn bạn! Thật không may là tôi không thể chấp nhận hai câu trả lời. . . – ruakh

+0

@ruakh Không sao, cảm ơn! – tiffon

0

Như câu trả lời khác nói, nó dường như là một lỗi.

Tuy nhiên, có một cách giải quyết dễ dàng có sẵn: 'abcdefghi'.match(/(.?e.?)/)

Bằng cách đó bạn sẽ có được kết quả chính xác trong cả hai [0] (các nhóm tiềm ẩn chứa toàn bộ chuỗi regex phù hợp) và [1] (phân nhóm theo quy định của ())

+0

Thật vậy, Jonathan Lonowski đã chỉ ra điều này trong một bình luận ở trên (mặc dù ông đã gợi ý sử dụng một nhóm không bắt giữ, '/ (?:.? E.?) /', Có * không * hiệu ứng khác hơn là làm việc xung quanh lỗi). – ruakh

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