2011-07-21 16 views
7

क्या निम्नलिखित कोड मान्य है?क्या " /" जावास्क्रिप्ट रेगेक्स के अंदर मान्य है?

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

ऐसा लगता है कि कई जावास्क्रिप्ट minifiers (http://jscompress.com/ पर jsmin सहित) दूसरी पंक्ति पर विचार करें "//" एक टिप्पणी के शुरू होने के लिए। मुझे लगता है कि यह "trivially" कार्यान्वित minifiers में एक बग है, क्योंकि सभी ब्राउज़र कार्यान्वयन मैंने बिना किसी समस्या के इसे चलाने की कोशिश की। Try it on jsfiddle

+3

इसलिए यही कारण है कि कुछ रेगेक्स इंजन आपको विभिन्न डिलीमीटरों को निर्दिष्ट करने की अनुमति देते हैं ... – BoltClock

+0

मैं सोच रहा हूं कि स्पेक कैसे कहता है कि यह कोई टिप्पणी शुरू नहीं करता है। – pimvdb

+1

शायद वही तरीका 'var q = "//"; 'मान्य है। –

उत्तर

3

कि मैं इसे चश्मा में देख अप में रुचि थी, और यह के अनुसार यह मान्य है:

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 

\/ माना जाता है RegularExpressionBackslashSequence, और इसलिए RegularExpressionBody का हिस्सा है, और नतीजतन // टिप्पणी मार्कर का हिस्सा नहीं हो सकता है।

3

हां, यह वैध जावास्क्रिप्ट है :) यह मिनीफायर में एक बग है, और शायद इसे ठीक किया जाना चाहिए। आप इसे चारों ओर हो सकता है अगर आप अपने regex बनाकर चाहता था यह के अंत में कुछ बेवकूफ है की तरह है:

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

कौन सा बुनियादी तौर पर कहते हैं, या तो स्ट्रिंग के अंत, या नहीं स्ट्रिंग के अंत, पर कब्जा करने के बिना । लेकिन मुझे नहीं लगता कि यह एक अच्छा समाधान है और मैं इसे अपने आप का उपयोग नहीं करूँगा।

+4

बेहतर: 'नया RegExp ("/") वापस करें। Exec ("\ /"); ' – BoltClock

+0

आह, ज़ाहिर है! हाहा – Paulpro

+1

@PaulPRO '। $ $ एक नई लाइन से मेल नहीं खाता है, इसलिए यह मूल regexp के बराबर नहीं है। – Karolis

3

हां, यह कानूनी है। \/ एक शाब्दिक / से मेल खाता है। पहले \/ से बच निकले। रेखा:

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

का मूल्यांकन करता है:

["/"] 
+0

जैसा कि पहेली में दिखाया गया है :) – BoltClock