सबसे पहले, ध्यान दें कि इस regex एक एकल गिनती प्रणाली में प्रतिनिधित्व संख्या पर लागू होता है, अर्थात
1 is 1
11 is 2
111 is 3
1111 is 4
11111 is 5
111111 is 6
1111111 is 7
और इतने पर। वास्तव में, किसी भी चरित्र का उपयोग किया जा सकता है (इसलिए अभिव्यक्ति में .
एस), लेकिन मैं "1" का उपयोग करूंगा।
दूसरा, ध्यान दें कि यह रेगेक्स समग्र (गैर-प्रधान) संख्याओं से मेल खाता है; इस प्रकार अस्वीकृति प्रारंभिकता का पता लगाती है।
स्पष्टीकरण:
अभिव्यक्ति की पहली छमाही,
.?
का कहना है कि तार "" (0) और "1" (1) कर रहे हैं मैच, यानी प्राइम (परिभाषा के अनुसार, though arguable।)
सरल अंग्रेजी में दूसरा आधा, कहें एस:
सबसे छोटी स्ट्रिंग से मिलान करें जिसका लंबाई कम से कम 2 है, उदाहरण के लिए, "11" (2)। अब, देखें कि क्या हम इसे दोहराकर पूरी स्ट्रिंग से मेल खा सकते हैं। क्या "1111" (4) मैच है? क्या "111111" (6) मैच है? क्या "11111111" (8) मैच है? और इसी तरह। यदि नहीं, तो अगली छोटी स्ट्रिंग, "111" (3) के लिए फिर से प्रयास करें। आदि
अब आप देख सकते हैं कि, यदि मूल स्ट्रिंग एक कई अपने सबस्ट्रिंग के रूप में मिलान नहीं किया जा सकता है, तो परिभाषा के द्वारा, यह प्रधानमंत्री है!
बीटीडब्ल्यू, गैर-लालची ऑपरेटर ?
वह है जो "एल्गोरिदम" को सबसे छोटा और गिनती से शुरू करता है।
क्षमता:
@TeddHopp नोटों के रूप में, अच्छी तरह से:
यह दिलचस्प है, लेकिन निश्चित रूप से कुशल नहीं, विभिन्न तर्क, जिनमें से कुछ मैं नीचे को मजबूत करेंगे द्वारा है अज्ञात चलनी-एराटोस्टेनेस दृष्टिकोण 4, 6, और 9 जैसे पूर्णांक के गुणकों की जांच करने के लिए परेशान नहीं होगा, 2 और 3 के गुणकों की जांच करते समय पहले से ही "दौरा" किया जा रहा है। हां, यह रेगेक्स दृष्टिकोण प्रत्येक छोटे पूर्णांक को पूरी तरह से जांचता है।
@PetarMinchev नोट्स के रूप में, हम संख्या के वर्ग रूट तक पहुंचने के बाद गुणक-जांच योजना "शॉर्ट-सर्किट" कर सकते हैं। हमें ऐसा करने में सक्षम होना चाहिए क्योंकि वर्ग रूट की तुलना में अधिक वर्ग रूट की तुलना में कम के साथ साझेदार होना चाहिए (क्योंकि अन्यथा वर्ग रूट से अधिक दो कारक संख्या से अधिक उत्पाद उत्पन्न करेंगे), और यदि यह अधिक कारक मौजूद है, तो हमें कम कारक का सामना करना पड़ सकता था (और इस प्रकार, मिलान किया गया)।
@Jesper और कटाई के साथ @Brian नोट के रूप में, एक गैर एल्गोरिथम दृष्टिकोण से, पर विचार कैसे एक रेगुलर एक्सप्रेशन स्मृति आवंटन स्ट्रिंग स्टोर करने के लिए, जैसे से शुरू होगाchar[9000]
9000 के लिए। अच्छा, यह आसान था, है ना? ;)
@Foon नोट्स के रूप में, संभाव्य विधियां मौजूद हैं जो बड़ी संख्या के लिए अधिक कुशल हो सकती हैं, हालांकि वे हमेशा सही नहीं हो सकते हैं (इसके बजाय स्यूडोप्रिम्स को बदलना)। लेकिन ऐसे निर्धारक परीक्षण भी हैं जो चावल-आधारित तरीकों से 100% सटीक और कहीं अधिक कुशल हैं। Wolfram's का एक अच्छा सारांश है।
स्रोत
2012-10-03 19:57:08
देखें: http://stackoverflow.com/questions/3329766/how-does-this-regular-expression-work – NullUserException
ठीक है, मैं अपनी टिप्पणी वापस लेता हूं। यह वास्तव में अजीब है। –
@NullUserException ओह लिंक के लिए धन्यवाद - मुझे लगता है कि मैं देखता हूं कि कोई मेरे प्रश्न के दूसरे भाग का उत्तर दे सकता है या नहीं। – arshajii