यह कैसे काम करता है?
ऑटोमेटा सिद्धांत पर एक नज़र डालें
संक्षेप में, प्रत्येक नियमित अभिव्यक्ति में एक समान परिमित ऑटोमेटन होता है और इसे परिमित ऑटोमेटन के लिए संकलित और अनुकूलित किया जा सकता है। शामिल एल्गोरिदम कई संकलक पुस्तकों में पाए जा सकते हैं। ये एल्गोरिदम यूनिक्स प्रोग्राम जैसे कि awk और grep द्वारा उपयोग किए जाते हैं।
हालांकि, अधिकांश आधुनिक प्रोग्रामिंग भाषाएं (पर्ल, पायथन, रूबी, जावा (और जेवीएम आधारित भाषाएं), सी #) इस दृष्टिकोण का उपयोग नहीं करती हैं। वे एक पुनरावर्ती बैकट्रैकिंग दृष्टिकोण का उपयोग करते हैं, जो एक पेड़ में एक नियमित अभिव्यक्ति या नियमित अभिव्यक्ति के विभिन्न उपखंडों का प्रतिनिधित्व करने वाले निर्माणों के अनुक्रम को संकलित करता है। अधिकांश आधुनिक "नियमित अभिव्यक्ति" वाक्यविन्यास बैकरेफरेंस प्रदान करते हैं जो नियमित भाषाओं के समूह के बाहर हैं (उनका परिमित ऑटोमेटा में कोई प्रतिनिधित्व नहीं है), जो पुनरावर्ती दृष्टिकोण में तुच्छ रूप से लागू होते हैं।
अनुकूलन आमतौर पर एक अधिक कुशल राज्य मशीन का उत्पादन करता है। उदाहरण के लिए: आआआब | आआआक | अआअद पर विचार करें। एक सामान्य प्रोग्रामर को सरल लेकिन कम कुशल खोज कार्यान्वयन (अलग से तीन तार की तुलना) दस मिनट में मिल सकता है। लेकिन यह एहसास आआआ [bcd] के बराबर है, पहले चार 'a' को खोजकर एक बेहतर खोज की जा सकती है, फिर [b, c, d] के विरुद्ध 5 वें वर्ण का परीक्षण करें। अनुकूलन की प्रक्रिया कई वर्षों पहले मेरे संकलक गृह कार्य में से एक थी इसलिए मुझे लगता है कि यह सबसे आधुनिक नियमित अभिव्यक्ति इंजन में भी है।
दूसरी ओर, राज्य मशीनों को कुछ लाभ होता है जब वे तार को स्वीकार कर रहे होते हैं क्योंकि वे "तुच्छ कार्यान्वयन" की तुलना में अधिक स्थान का उपयोग करते हैं। SQL स्ट्रिंग्स पर उद्धरण से बचने के लिए एक कार्यक्रम पर विचार करें, जो है: 1) एकल उद्धरण चिह्नों के साथ शुरू और समाप्त होता है; 2) एकल उद्धरण चिह्न लगातार दो एकल उद्धरणों से बच जाते हैं। तो: इनपुट ['a' '] को आउटपुट [a] देना चाहिए। एक राज्य मशीन के साथ, लगातार एकल उद्धरण चिह्न दो राज्यों द्वारा नियंत्रित किए जाते हैं। ये दो राज्य इनपुट इतिहास को याद रखने के उद्देश्य से कार्य करते हैं जैसे कि प्रत्येक इनपुट चरित्र को केवल एक बार संसाधित किया जाता है, जैसा कि निम्नलिखित सचित्र है:
...
S1->'->S2
S1->*->S1, output *, * can be any other character
S2->'->S1, output '
S2->*->END, end the current string
इसलिए, मेरी राय में, कुछ तुच्छ मामलों में नियमित अभिव्यक्ति धीमी हो सकती है, लेकिन आमतौर पर मैन्युअल रूप से तैयार की गई खोज एल्गोरिथ्म की तुलना में तेज़ होती है, इस तथ्य को देखते हुए कि अनुकूलन मानव द्वारा मज़बूती से नहीं किया जा सकता है।
(यहां तक कि एक स्ट्रिंग को खोजने जैसे तुच्छ मामलों में, एक स्मार्ट इंजन राज्य के नक्शे में एकल पथ को पहचान सकता है और उस हिस्से को एक साधारण स्ट्रिंग तुलना में कम कर सकता है और प्रबंध राज्यों से बच सकता है।)
एक फ्रेमवर्क / लाइब्रेरी से एक विशेष इंजन धीमा हो सकता है क्योंकि इंजन अन्य चीजों का एक गुच्छा करता है जो एक प्रोग्रामर को आमतौर पर ज़रूरत नहीं होती है। उदाहरण: .NET में Regex वर्ग मैच, समूह और कैप्चर सहित वस्तुओं का एक समूह बनाता है।