2011-08-19 13 views
8

मैं jQuery स्रोत कोड में इस नियमित अभिव्यक्ति में आए:यह नियमित अभिव्यक्ति भाग क्या जोड़ता है?

... 
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, 
... 

मैं सोच रहा था कि ऐसा क्यों नहीं बल्कि जटिल था। मैं विशेष रूप से दूसरे भाग के पीछे कारण में दिलचस्पी रखता हूँ:

(?:.*? rv:([\w.]+))? 

मैं कुछ शोध किया है, लेकिन मैं समझ नहीं सकता है क्या नियमित अभिव्यक्ति के इस हिस्से कहते हैं।

(?:)  to match but not capture 
.*?  any amount of any character 
rv:  something literal 
([\w.]+) one or more word characters or a dot 
?   appear 0 or 1 time 

विशेष रूप से, कि पिछले ? मेरे लिए बहुत मतलब नहीं है। पूरे दूसरे भाग से मेल खाता है यदि उस दूसरे भाग द्वारा परिभाषित एक सबस्ट्रिंग है या नहीं। कुछ परीक्षण के साथ और त्रुटि नियमित अभिव्यक्ति बस से अलग प्रतीत नहीं होता:

/(mozilla)/ 

कोई क्या नियमित अभिव्यक्ति के दूसरे भाग करने के लिए माना जाता है पर कुछ प्रकाश डाला सकता है? यह क्या बाधा डालता है; कौन सी स्ट्रिंग विफल होती है जो /(mozilla)/ या दूसरी तरफ से गुज़रती है? (हालांकि ऐसा लगता है कि वर्तमान में jQuery केवल जांच करता है कि regex से मेल खाता)

+0

मुझे लगता है यह कुछ मोज़िला faking ब्राउज़र अपने उपयोगकर्ता-एजेंट स्ट्रिंग में इसके सामने के आसपास काम करने के लिए है। –

+0

क्या आप थोड़ा और संदर्भ प्रदान कर सकते हैं? एक jQuery प्लगइन का यह हिस्सा था? यदि हां, तो कौन सा? यह कोड कहां दिखाई देता है यह जानना कि कुछ प्रकाश डाला जा सकता है/क्यों लेखक लेखक को यह विशेष पैटर्न चाहते थे, और इसलिए पैटर्न क्या कर रहा है। – jefflunt

+0

@ राफ केटलर: मुझे यकीन नहीं है कि मैं आपको सही ढंग से समझता हूं। Reakersxp fakers को रोकने के लिए क्या जोड़ता है? – pimvdb

उत्तर

4

दो रेगेक्स एक ही स्ट्रिंग से मेल खाते हैं, लेकिन उनके कैप्चरिंग समूहों में अलग-अलग जानकारी संग्रहीत करेंगे।

स्ट्रिंग के लिए

: mozilla asdf rv:sadf

/(mozilla)(?:.*? rv:([\w.]+))?/ 
$0 = 'mozilla asdf rv:sadf' 
$1 = 'mozilla' 
$2 = 'sadf' 

/(mozilla)/ 
$0 = 'mozilla' 
$1 = 'mozilla' 
$2 = '' 
1

([\w.]+)(?:.*? rv:([\w.]+)) के अंदर कैप्चर कर रहा है, तो हो सकता है इस regex अतीत में संशोधन संख्या प्राप्त करने के लिए इस्तेमाल किया गया था।

2

पहले, मैं के बीच अंतर को स्पष्ट करना चाहते हैं:

.*? - non-greedy match 
.* - greedy match 

गैर लालची संभव बाइट्स की सबसे छोटी संख्या (खोज स्ट्रिंग के बाकी दी गयी है) से मेल खाएगा, और लालची एक होगा सबसे अधिक मैच।

mozilla some text here rv:abc xyz 

regex दोनों 'मोज़िला' और 'एबीसी' वापस आ जाएगी:

स्ट्रिंग को देखते हुए। लेकिन अगर 'आरवी:' मौजूद नहीं है, तो रेगेक्स अभी भी 'मोज़िला' वापस कर देगा।

+0

सच है, लेकिन उन्हें आमतौर पर क्रमशः "गैर लालची" और "लालची" कहा जाता है। –

+0

हां। मेरी याददाश्त उस तरह से थोड़ा मजाकिया है। मैं संपादित करूंगा। –

0

(पैट) एक पूर्ण निहित पैटर्न मिलान के लिए एक पैटर्न सीमांकक है। (?: Pat) ऊपर की अस्वीकृति है, जैसे कैरेक्टर सेट ब्रैकेट [^] की अस्वीकृति [] है। जावास्क्रिप्ट में के साथ नकारात्मकता होती है! । किसी भी चरित्र से मेल खाता है, * मैचों का क्वांटिफायर है, और नए रेगेक्स इंजनों में भी {0,} के रूप में लिखा जा सकता है (लेकिन उन तीन अतिरिक्त पात्रों के परिणामस्वरूप आपके कीबोर्ड की पिछली मौत हो सकती है!) ? बेमानी मैच परिमाणक: शून्य या एक समय मेल खा सकता है आर.वी.: ([। \ डब्ल्यू]) .... शाब्दिक आर.वी.

एक और submatch, माता पिता के मैच भीतर शून्य या एक समय से मेल कर सकते हैं)? [\ w।] ...एस्केप्टेड डब्ल्यू "\ डब्ल्यू" के साथ चरित्र सेट: किसी भी अल्फान्यूमेरिकल कैरेक्टर, उर्फ ​​[ए-जेए-जेड 0-9_] के बाद एक शाब्दिक डॉट और प्रति मैच क्वांटिफायर + हो सकता है, एक या अधिक बार हो सकता है

इंजीनियर को रिवर्स करने के लिए पैटर्न मिलान का अर्थ: केवल एक टेक्स्ट एडिटर में बाएं से दाएं से मूल्यांकन करें और यादृच्छिक अक्षरों द्वारा अक्षरों को प्रतिस्थापित करें जो ध्यान में आते हैं और जिसके लिए प्रत्येक उप-अभिव्यक्ति मिलान होती है। फिर एक कदम वापस लें और विचार करें कि रेगेक्स क्या हो सकता है।

+1

कृपया एसओ [कोड स्वरूपण] (http://stackoverflow.com/editing-help#code) सुविधा का लाभ उठाएं; जैसा कि अब है, आपका जवाब लगभग अपठनीय है। –

+1

उत्तर में बुद्धि के लिए कई त्रुटियां भी शामिल हैं: ** 1। ** '(pat)' एक कैप्चरिंग समूह है; ** 2। ** '(?: Pat)' एक * गैर-कैप्चरिंग * समूह है, न कि नकारात्मक लग रहा है जैसा कि आप प्रतीत होता है (वह '(?! Pat)' होगा; ** 3। ** '*' लगभग सभी रेगेक्स स्वादों में '{0,}' के बराबर है - उम्र के साथ इसके साथ कुछ लेना देना नहीं है; ** 4। ** कि पहले '' 'पूर्ववर्ती' * 'अनिच्छुक (अनावश्यक नहीं) बनाता है; ** 5। ** '[\ w।]' '[ए-ज़ा-जे 0-9 _।]' के बराबर है (यानी, यह एक शब्द चरित्र * या एक बिंदु * से मेल खाता है, नहीं * एक डॉट * के बाद, जैसा कि आपने कहा। –

2

नोट: अब मुझे पता है कि यह उत्तर दायरे से थोड़ा सा हो सकता है। मैं इसे और जानकारी के लिए अभी भी छोड़ दूंगा, लेकिन अगर आपको लगता है कि यह गुंजाइश से बहुत अधिक है, तो बस टिप्पणी करें और मैं इसे हटा दूंगा।


@arnaud सही है, यह संस्करण प्राप्त करना है। Here is the code जहां भाव प्रयोग किया जाता है:

uaMatch: function(ua) { 
    ua = ua.toLowerCase(); 

    var match = rwebkit.exec(ua) || 
       ropera.exec(ua) || 
       rmsie.exec(ua) || 
       ua.indexOf("compatible") < 0 && rmozilla.exec(ua) || 
       []; 

    return { browser: match[1] || "", version: match[2] || "0" }; 
}, 

आप देख सकते हैं समारोह संस्करण देता है कि अगर मिल गया और 0 नहीं तो। यह कुछ ब्राउज़रों के लिए आवश्यक हो सकता है या डेवलपर्स के लिए अतिरिक्त जानकारी के रूप में प्रदान किया जाता है।

समारोह here कहा जाता है:

browserMatch = jQuery.uaMatch(userAgent); 
if (browserMatch.browser) { 
    jQuery.browser[ browserMatch.browser ] = true; 
    jQuery.browser.version = browserMatch.version; 
} 
संबंधित मुद्दे