2009-08-09 11 views
15

जावा में रेगेक्स ऑप्टिमाइज़ेशन पर एक बहुत अच्छा article पढ़ने के बाद मैं सोच रहा था कि तेज़ और कुशल नियमित अभिव्यक्तियां बनाने के लिए अन्य अच्छी युक्तियां क्या हैं?रेगेक्स प्रदर्शन अनुकूलन युक्तियाँ और चालें

+0

मैं उल्लेख करने के लिए [बूलियन अनुक्रम] चाहते हैं (https://github.com/NaturalIntelligence/BooleanSequence) जो वर्तमान में आरई के कम प्रतीकों का समर्थन करता है लेकिन वे तेज़ और लचीले और कई उपयोगी सुविधाओं से भरे हुए हैं। आप अधिक सुविधाओं को जोड़ने या उन्हें अधिक तेज़ बनाने के लिए अपने स्वयं के मैचर्स लिख सकते हैं। वे ऑटो ऑप्टिमाइज़ेशन भी करते हैं और आप देख सकते हैं कि जेसन या जेसन आधारित ग्राफ का उपयोग करके उनका मूल्यांकन कैसे किया जाता है। –

उत्तर

7

उपयोग किसी भी (डॉट) ऑपरेटर किफ़ायत से, यदि आप इसे किसी अन्य तरीके से कर सकते हैं, यह करना, डॉट हमेशा तुम्हें काट लेगी ...

मैं यकीन नहीं है कि PCRE NFA है नहीं कर रहा हूँ और मैं कर रहा हूँ केवल पीसीआरई से परिचित है, लेकिन + और * आमतौर पर डिफ़ॉल्ट रूप से लालची होते हैं, वे इसे उपयोग के आसपास जितना संभव हो उतना मिलान करेंगे +? तथा *? कम से कम संभव से मिलान करने के लिए, अपने regexp लिखते समय इन दो खंडों को ध्यान में रखें।

3

नियमित अभिव्यक्ति का उपयोग करने के लिए नहीं जानते - कभी-कभी हाथ कोडित समाधान अधिक कुशल और अधिक समझ में आता है।

उदाहरण: मान लें कि आप एक पूर्णांक से मेल खाना चाहते हैं जो 3 तक समान रूप से विभाजित है। इसे पूरा करने के लिए एक सीमित राज्य मशीन को डिजाइन करना मुश्किल है, और इसलिए एक संबंधित रेगेक्स मौजूद होना चाहिए, लेकिन इसे लिखना इतना छोटा नहीं है - और मुझे यकीन है कि इसे डीबग करना नफरत है!

+1

हां ... लेकिन कुछ संख्यात्मक प्रणालियों में यह मामूली है। :- पी –

+9

आपका मतलब यह है: '((0 | 3 | 6 | 9) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (2 | 5 | 8))) | (((2 | 5 | 8) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (1 | 4 | 7))) ((0 | 3 | 6 | 9) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (1 | 4 | 7))) * ((1 | 4 | 7) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (2 | 5 | 8))))) * '? (हाँ, मैंने एक डीएफए बनाया और फिर जीएनएफए फिर regex: पी) –

+1

जब आपके पास कोई बैक्रेरेंस नहीं है तो तेज़ कार्यान्वयन का उपयोग करें। https://swtch.com/~rsc/regexp/regexp1.html – clemens

27
  1. उपयोग गैर पर कब्जा समूह (?:pattern) जब आप एक समूह दोहराने की आवश्यकता है किंतु उसे काटा मूल्य कि एक पारंपरिक (capturing) समूह से आता है उपयोग करने की आवश्यकता नहीं है।
  2. (?>pattern) लागू होने पर atomic group (या गैर-बैकट्रैकिंग सबएक्सप्रेस) का उपयोग करें।
  3. catastrophic backtracking से बचें, नियमित रूप से गैर-मैचों के लिए समाप्त होने के लिए अपने नियमित अभिव्यक्तियों को डिज़ाइन करके प्लेग की तरह।

मैंने इन तकनीकों का प्रदर्शन करने वाला एक वीडियो बनाया है। मैंने बहुतcatastrophic backtracking आलेख (x+x+)+y में खराब लिखित नियमित अभिव्यक्ति के साथ शुरू किया। और फिर मैंने ऑप्टिमाइज़ेशन की श्रृंखला के बाद इसे 3 मिलियन गुना तेजी से बनाया, प्रत्येक परिवर्तन के बाद बेंचमार्किंग। वीडियो नेट के लिए विशिष्ट है, लेकिन इन बातों से कई के साथ-साथ अधिकांश अन्य regex जायके पर लागू होते हैं:

.NET Regex Lesson: #5: Optimization

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