यदि नियमित अभिव्यक्ति सामान्य प्रक्रियात्मक मैचर्स (जैसे पर्ल, जावा, पायथन, रूबी इत्यादि) की "उन्नत सुविधाएं" का उपयोग करती हैं जो नियमित रूप से उन भाषाओं को स्वीकार करने की अनुमति देती हैं, तो आप भाग्य से बाहर हैं। समस्या सामान्य रूप से अपरिहार्य है। जैसे एक पुशडाउन automaton एक ही संदर्भ मुक्त (सीएफ) भाषा को पहचानता है या नहीं, इसकी समस्या यह है कि एक और अपरिहार्य है। विस्तारित नियमित अभिव्यक्तियां सीएफ भाषाओं का वर्णन कर सकती हैं।
दूसरी तरफ, यदि नियमित अभिव्यक्ति सैद्धांतिक अर्थ में "सत्य" होती है, जिसमें केवल परिमित, वैकल्पिकता और क्लेन स्टार को एक सीमित वर्णमाला के साथ तारों पर तब्दील किया जाता है, साथ ही इन पर सामान्य वाक्य रचनात्मक चीनी (चरित्र वर्ग, +,?, आदि), तो एक साधारण बहुपद समय एल्गोरिदम है।
मैं तुम्हें पुस्तकालयों को नहीं दे सकता है, लेकिन इस:
For each pair of regexes r and s for languages L(r) and L(s)
Find the corresponding Deterministic Finite Automata M(r) and M(s)
Compute the cross-product machine M(r x s) and assign accepting states
so that it computes L(r) - L(s)
Use a DFS or BFS of the the M(r x s) transition table to see if any
accepting state can be reached from the start state
If no, you can eliminate s because L(s) is a subset of L(r).
Reassign accepting states so that M(r x s) computes L(s) - L(r)
Repeat the steps above to see if it's possible to eliminate r
एक DFA में एक regex परिवर्तित आम तौर पर एक गैर नियतात्मक आटोमैटिक मशीन प्राप्त करने के लिए थॉम्पसन के निर्माण का उपयोग करता है। यह सब्सट्रेट निर्माण का उपयोग कर डीएफए में परिवर्तित हो जाता है। क्रॉस-उत्पाद मशीन एक और मानक एल्गोरिदम है।
यह सब 1 9 60 के दशक में काम किया गया था और अब यह किसी भी अच्छे अंडरग्रेड कंप्यूटर विज्ञान सिद्धांत पाठ्यक्रम का हिस्सा है। विषय के लिए सोने का मानक Hopcroft and Ullman, Automata Theory है।
पूरी तरह से सुनिश्चित नहीं है कि मैं समझता हूं - क्या आप कह रहे हैं कि आपके पास दो regexes, 'a.c *' और 'abc *' है? और यदि आप समान हैं, या आंशिक रूप से वही हैं, तो आप समझ नहीं पाएंगे? या 'a.c * ⊃ abc *' एक संपूर्ण regex है? जैसा कि मैंने – SmokeyPHP
से पहले नोटेशन कभी नहीं देखा है ⊃ का मतलब सख्त सुपरसेट है, शायद मुझे ⊇ का उपयोग करना चाहिए था, जो अधिक आम है। मैं यह कहने की कोशिश कर रहा हूं कि 'abc *' द्वारा स्वीकार की गई प्रत्येक स्ट्रिंग को 'a.c *' –
द्वारा भी स्वीकार किया जाता है Regex की आपकी परिभाषा क्या है? अधिकांश प्रोग्रामिंग भाषाओं में, नियमित अभिव्यक्ति वाक्यविन्यास, जो अक्सर संदर्भों की अनुमति देता है, नियमित भाषाओं की तुलना में अधिक शक्तिशाली है। इसलिए समावेशन की निर्णय भी स्पष्ट नहीं है ... –