2009-12-11 22 views
7

में मर्ज करें मेरे पास कई regexes (वास्तव में कई हजार) हैं, और मुझे यह जांचना होगा कि एक स्ट्रिंग इनमें से किसी भी रेगेक्स से मेल खाती है या नहीं। यह बहुत ही कुशल नहीं है, इसलिए मैं इन सभी regexes को एक regex के रूप में विलय करना चाहता हूं।कई रेगेक्स को एक ही

उदाहरण के लिए, यदि एक इन regexes है:

  • 'foo * बार'
  • 'foo * जिप'
  • 'जैप * बार'

मैं चाहते हैं 'foo * (bar | ज़िप) | zap * bar' जैसे कुछ प्राप्त करें।

क्या ऐसा कुछ एल्गोरिदम, पुस्तकालय या उपकरण है?

उत्तर

7

आप केवल रेगेक्स का उपयोग कर सकते हैं या (|) (और स्ट्रिंग की शुरुआत/अंत के लिए एंकर)।

अधिकांश अच्छे रेगेक्स पुस्तकालय अपने रिजिक्स से इसे बनाने के बाद अपने परिमित राज्य ऑटोमाटा को अनुकूलित करते हैं। उदाहरण के लिए, पीसीआरई करता है।

यह चरण आमतौर पर आपकी अनुकूलन समस्या का ख्याल रखता है, यानी। वे अधिकांश परिवर्तनों को लागू करते हैं जिन्हें आपको "हाथ से" करना होगा।

+0

अच्छा पहला कदम है, लेकिन आपको हाथ से अनुकूलित करने की ज़रूरत नहीं है: http://www.rexegg.com/regex-optimizations.html –

0

मैं कल्पना नहीं कर सकता, भले ही संभव हो, परिणामी रेगेक्स और अधिक कुशल होगा।

+2

मैं असहमत हूं; "foo (?: bar | baz)" के लिए एक रेगेक्स खोज "foo bar" की खोज और "foo baz" की खोज से तेज होने जा रही है, क्योंकि अलग-अलग खोजों को मिलान करने की आवश्यकता होगी (या नहीं) "foo" दो बार हिस्सा –

+1

-1 जिस तरह से automaton बनाया गया है स्वचालित रूप से कई मामलों को अनुकूलित करेगा। इसके शीर्ष पर, आप परिणामस्वरूप राज्य मशीन को और अनुकूलित कर सकते हैं (Vlad का उत्तर देखें)। –

+0

मुझे ~ = सही किया गया। धन्यवाद! – hometoast

0

मुझे इस बात पर बहुत संदेह है कि इस तरह के किसी भी उपकरण को सभी अलग-अलग तरीकों से निपटने के लिए बहुत जटिल होना होगा जिसमें रेगेक्स को जोड़ा जा सकता है।

यदि आपके पास रेगेक्स आपके अपेक्षाकृत सरल हैं, जैसे कि आपके उदाहरणों में, आपके पास कुछ भाग्य हो सकता है, हालांकि।

2

सिद्धांत में एक रेगेक्स एक (nondeterministic) परिमित-राज्य automata है; इस प्रकार वे विलय और कम किया जा सकता है। आप शुरुआती बिंदु के रूप में this पर एक नज़र डाल सकते हैं।

सावधान रहें, हालांकि, यह सबसे सही जवाब नहीं हो सकता है। आपको हजारों नियमित अभिव्यक्तियों से निपटने के लिए क्यों करना है? मैं केवल ऐसी चीज के रखरखाव नरक को समझ सकता हूं। शायद आपको एक पार्सर और व्याकरण लिखने पर विचार करना चाहिए - बहुत आसानी से किया जाता है (और व्याकरण किसी भी तरह से regexps से अधिक शक्तिशाली हैं)।

+0

कुछ रेगेक्स इंजनों में ऐसी विशेषताएं शामिल हैं जो डीएफए में लागू नहीं हैं जैसे मनमाने ढंग से नेस्टेड ब्रांडेसिस मिलान। इस दृष्टिकोण को लेने से पहले सुनिश्चित करें कि आपके शुरुआती रेगेक्स वास्तव में डीएफए में परिवर्तित हो सकते हैं ताकि आप उन्हें एनएफए के साथ जोड़ सकें जिसे आप फिर डीएफए में परिवर्तित कर दें और कम करें। – Techrocket9

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