2011-10-21 21 views
6

मैं अब कुछ वर्षों से नियमित अभिव्यक्तियों का उपयोग कर रहा हूं और उनके साथ सहज महसूस करता हूं, लेकिन मैं सोच रहा था कि उनका उपयोग करते समय कोई सीमाएं हैं या नहीं। मैं रिकर्सन से संबंधित सीमाओं के बारे में जानता हूं (यहां http://blogs.msdn.com/b/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx पर चर्चा की गई)। क्या स्मृति से संबंधित कोई सीमाएं हैं? मुझे लगता है कि आप एक स्ट्रिंग को कैप्चर कर सकते हैं जितना आप स्मृति में फिट कर सकते हैं (या वीएम आपको अनुमति देगा)।नियमित अभिव्यक्तियों की सीमाएं?

क्या रेगेक्स के साथ कोई अन्य सीमाएं हैं जिन्हें मुझे पता होना चाहिए?

अग्रिम धन्यवाद,

क्रिस

+1

आपको वास्तव में उपयोग करने वाले रेगेक्स इंजन को निर्दिष्ट करने की आवश्यकता है, क्योंकि प्रत्येक के पास अलग-अलग सीमाएं हैं। कुछ लोग कुछ व्याकरण की तरह regexes की अनुमति देने के लिए चले गए हैं। टीच्रिस्ट (टॉम क्रिस्सेन) के माध्यम से यहां देखकर एसओ पर आप कुछ रेगेक्स इंजन तक पहुंचने की शक्ति का विचार प्राप्त कर सकते हैं। – ninjalj

उत्तर

5

सीमाएं

  1. सब कुछ का समाधान नहीं कर सकता। (एसओ पर कोई भी कहता है कि क्या होता है जब आप रेगेक्स के साथ एचटीएमएल को पार्स करने का प्रयास करते हैं)
  2. सब कुछ - पठनीयता और प्रदर्शन के मुद्दों के लिए उपयोग नहीं किया जाना चाहिए। जहां उचित हो प्रयोग करें। सरल कार्य के लिए नहीं, स्ट्रिंग के सबस्ट्रिंग्स की तरह, और जटिल कार्य के लिए भी नहीं।

नीचे की ओर, यह एक उपकरण है। इसे किसी अन्य उपकरण की तरह प्रयोग करें। इसका इस्तेमाल न करें। इसे अपने टूलकिट में एकमात्र टूल न होने दें।

8

विशालकाय regexes काफी धीमी और स्मृति भूखा हो सकता है। मुझे पता है, क्योंकि मैंने एक बनाया है। यह एक regex द्वारा टोकननाइज़ नहीं किया जाना चाहिए टोकननाइज़ कर सकते हैं। :-) यदि आप एक लिंक चाहते हैं ... अब ... मैंने कभी "छोटे" regexes बेंचमार्क नहीं किया है, इसलिए मैं उनकी गति नहीं जानता। वे निश्चित रूप से लिखने के लिए कॉम्पैक्ट हैं।

आह मैं भूल रहा था, regexes ईविल हैं। उनकी मुख्य समस्या यह है कि वे एक हथौड़ा की तरह हैं और जब आप उन्हें रखते हैं, तो आप सभी समस्याओं को नाखून की तरह बनाने की कोशिश करते हैं। तो उनकी मुख्य समस्या उपयोगकर्ता (प्रोग्रामर) में है।

पहली "बड़ी" सीमा: जावास्क्रिप्ट केवल उनमें से एक सबसेट लागू करता है, बिना यूनिकोड समर्थन के। आम तौर पर जिस भाषा का आप सर्वर पक्ष का उपयोग करते हैं, उसका पूरा कार्यान्वयन होता है, इसलिए आप जेएस द्वारा सीमित हो जाते हैं। यहां तक ​​कि .NET की तरह पूर्ण कार्यान्वयन भी बड़ी सीमाएं हैं: सरोगेट जोड़े के लिए कोई समर्थन नहीं है और "रचना" वर्णों के लिए कोई समर्थन नहीं है (वर्ण जो संयोजन संयोजन का उपयोग करते हैं)। लेकिन, हमेशा के रूप में, समस्या प्रोग्रामर में है। यूनिकोड को कितने प्रोग्रामर जानते हैं, जो अंक के विभिन्न सेटों के यूनिकोड की जटिलताओं को जानते हैं?

दूसरा "बड़ा" सीमा: रखरखाव। जब वे लिखे जाते हैं तो वे जटिल और अपठनीय होते हैं। लेकिन महीनों बाद? वे बदतर हो जाते हैं! और यदि आपको एक नया प्रोग्रामर प्रशिक्षित करना है, तो अब उसे एक और भाषा सीखनी है: regex।

तीसरा "बड़ा" सीमा: वे बहुत अधिक छुपाते हैं। आप \d\s\d देखते हैं। इसका क्या मतलब है? एक अंक एक अंक और एक अंक? निश्चित रूप से। लेकिन .NET Regexes में \d और \s दोनों एक माइक्रोवेल्ड "छुपाएं"। \d किसी भी गैर-यूरोपीय अंक "मैचों" (और यूनिकोड में कई सारे हैं)। \s "मैचों" इतने सारे गूढ़ स्थान हैं जिनमें से मुझे नाम भी नहीं पता ... मैं इसके बारे में भी सोचना नहीं चाहता हूं। वे बर्फबारी की तरह हैं। केवल 1/8 पानी से बाहर है, जबकि 7/8 छिपा हुआ है। लेकिन यह 7/8 है जो शायद आपको मार देगा।

+0

जावास्क्रिप्ट केवल "सबसेट" का समर्थन करता है तो यह regex की गलती कैसा है? और पठनीयता को वर्बोज रेगेक्स (जो, फिर से, जावास्क्रिप्ट समर्थित नहीं है) के साथ एक समस्या नहीं होनी चाहिए। निश्चित रूप से, आप विशाल, प्रदर्शन-गरीब रेगेक्स लिख सकते हैं यदि आप नहीं जानते कि आप क्या कर रहे हैं (या उपकरण का दुरुपयोग कर रहे हैं), जैसे आप किसी भी भाषा में खराब प्रोग्राम लिख सकते हैं। और -1 अयोग्य "बुराई" वर्गीकरण के लिए जो भावना का औंस नहीं बनाता है। –

+0

@TimPietzcker किसी ऑब्जेक्ट में दोष देना हमेशा बेवकूफ होता है। गलती बेवकूफ इंसान में है जिसने इसे बनाया/पेश किया। Regexes दोष नहीं है। वे गलती ** वाई ** हैं। और वे गलती ** y ** न केवल इसलिए हैं क्योंकि वे गलती हैं ** y ** लेकिन क्योंकि 1) वे एक और युग के बच्चे हैं, यूनिकोड या अंतर्राष्ट्रीयकरण के बिना एक और सरल युग और 2) प्रत्येक प्रोग्रामर ने उन्हें "बेहतर" अलग तरीका। वैसे ही वे * बुराई * नहीं हैं, जैसे कि बंदूक * बुराई नहीं है, लेकिन बंदूकें की तरह, वे व्यक्तियों को मूर्ख चीजें करते हैं। – xanatos

+0

@TimPietzcker अब, तथ्य यह है कि Regexes के कई अलग-अलग कार्यान्वयन हैं ... यह एक तरह से एक समस्या है। इसी तरह जब कई यूनिक्स थे (दूसरे के साथ संगत नहीं) यह "विखंडन" एक समस्या थी। अगर मुझे एएसपी.Net में रेगेक्स लिखना है, तो मुझे पता है कि मैं केवल जेएस पर उपलब्ध सबसेट का उपयोग कर सकता हूं, मैं इसे क्लाइंट साइड और सर्वर साइड का उपयोग करना चाहता हूं। ओह हाँ, मेरे पास फेरारी है, लेकिन मुझे गंदगी की सड़कों पर जाना है ... वाह! – xanatos

3

रेगेक्स केवल नियमित व्याकरण को संदर्भित कर सकते हैं, संदर्भ-मुक्त और उच्चतर आपको एक स्टैक की आवश्यकता है (यानी असली पार्सर)।

यह उनका एकमात्र वास्तविक सीमा है, प्रदर्शन विशेष कार्यान्वयन पर निर्भर करता है, लेकिन आम तौर पर एक राज्य मशीन की तुलना में भी धीमा होता है।

+5

-1: अधिकांश रेगेक्स इंजन (re2 के सकारात्मक अपवाद के साथ, जिसे मैंने सावधानी से नहीं देखा है) शुद्ध नियमित अभिव्यक्तियों से परे चला गया है। – ninjalj

+0

तो आप "purists" में से एक हैं जो स्टैक सक्षम regexes पहचान नहीं है? – xanatos

+0

@ निंजालज मुझे 'गैर-नियमित' नियमित अभिव्यक्तियों से अवगत नहीं था, क्या आप मुझे एक उदाहरण या आलेख में इंगित कर सकते हैं? धन्यवाद। –

संबंधित मुद्दे