2011-07-21 7 views
7

Mã sau có hợp lệ không?Có phải " /" hợp lệ bên trong một regex javascript không?

function test() { 
    return /\//.exec("\/"); 
} 
alert(test()); 

Dường như nhiều minifiers javascript (bao gồm JSMin tại http://jscompress.com/) xem xét các "//" trên dòng thứ hai là sự bắt đầu của một nhận xét. Tôi cho rằng đó là một lỗi trong minifiers "tầm thường" được triển khai, vì tất cả việc triển khai trình duyệt tôi đã thử chạy nó mà không có vấn đề gì. Try it on jsfiddle.

+3

Vì vậy, đây là lý do tại sao một số công cụ regex cho phép bạn chỉ định các dấu phân tách khác nhau ... – BoltClock

+0

Tôi tự hỏi làm thế nào spec nói rằng điều này không bắt đầu nhận xét. – pimvdb

+1

Có lẽ cùng một cách 'var q =" // ";' là hợp lệ. –

Trả lời

3

tôi đã quan tâm đến việc tìm kiếm nó trong các thông số kỹ thuật, và theo đó nó có giá trị:

RegularExpressionLiteral :: 
    /RegularExpressionBody/RegularExpressionFlags 
RegularExpressionBody :: 
    RegularExpressionFirstChar RegularExpressionChars 
RegularExpressionChars :: 
    [empty] 
    RegularExpressionChars RegularExpressionChar 
RegularExpressionFirstChar :: 
    RegularExpressionNonTerminator but not * or \ or/or [ 
    RegularExpressionBackslashSequence 
    RegularExpressionClass 
RegularExpressionChar :: 
    RegularExpressionNonTerminator but not \ or/or [ 
    RegularExpressionBackslashSequence 
    RegularExpressionClass 
RegularExpressionBackslashSequence :: 
    \ RegularExpressionNonTerminator 
RegularExpressionNonTerminator :: 
    SourceCharacter but not LineTerminator 

các \/ được coi một số RegularExpressionBackslashSequence và do đó là một phần của RegularExpressionBody và do đó không thể là một phần của điểm đánh dấu nhận xét //.

3

Vâng, đó là javascript hợp lệ :) Đó là lỗi trong trình chỉnh sửa và có thể sẽ được khắc phục. Bạn có thể nhận được xung quanh nó nếu bạn muốn bằng cách làm cho regex của bạn có một cái gì đó ngu ngốc ở phần cuối của nó như:

return /\/(?:.|$)/.exec("\/"); 

Mà về cơ bản nói, một trong hai phần cuối của chuỗi, hoặc không phải là kết thúc của chuỗi, mà không chiếm được . Nhưng tôi không nghĩ rằng đó là một giải pháp tốt và tôi sẽ không sử dụng nó bản thân mình haha.

+4

Tốt hơn: 'return new RegExp ("/"). Exec (" \/");' – BoltClock

+0

Ah, tất nhiên! haha – Paulpro

+1

@PaulPRO '. | $' không khớp với một dòng mới, vì vậy nó không tương đương với regexp gốc. – Karolis

3

Có, điều này là hợp pháp. \/ khớp với một chữ số /. \ đầu tiên thoát khỏi số /. Điểm mấu:

/\//.exec("\/"); 

để đánh giá:

["/"] 
+0

Như đã trình bày trong fiddle :) – BoltClock