में जोड़ना मान लें कि मेरे पास नियमित अभिव्यक्तियों की एक सूची है (बाहरी स्रोत - फ़ाइल, डेटाबेस इत्यादि से पढ़ें)। मैं यह जांचना चाहता हूं कि इन नियमित अभिव्यक्तियों में से कौन सा स्ट्रिंग मिलान करता है।एकाधिक नियमित अभिव्यक्तियों को एक automaton
मैं इन सब नियमित अभिव्यक्ति के माध्यम से पुनरावृति बना सकते हैं और उन्हें मेल खाते हैं, लेकिन सूची में एक बहुत बड़ा एक हो सकता है और यह एक महत्वपूर्ण ऑपरेशन है। है, लेकिन फिर समस्या यह है कि मैं केवल सबसे पहले मिलने वाला नियमित अभिव्यक्ति, सभी की पहचान कर सकते हैं |
मैं इन सब नियमित अभिव्यक्ति में (उन दोनों के बीच) के साथ गठजोड़ कर सकते हैं।
एक और विचार इन सभी नियमित अभिव्यक्ति के लिए एक automaton बनाने के लिए और के साथ अंतिम राज्यों चिह्नित करने के लिए, मान लें कि, इसी नियमित अभिव्यक्ति की अनुक्रमित हो सकता है। मैं http://cs.au.dk/~amoeller/automaton/ पर देख रहा था, एक पुस्तकालय जो नियमित अभिव्यक्तियों और automaton के साथ काम करने में सक्षम प्रतीत होता है, लेकिन यह सुनिश्चित नहीं है कि यह मेरी समस्या को हल करने के लिए बढ़ाया जा सके।
क्या आपके पास कोई अन्य विचार है?
एक कोड नमूना कुछ टिप्पणियों को स्पष्ट करने के लिए, मैं जोड़ दिया है:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternTest {
public static void main(String[] args) {
Pattern p = Pattern.compile("(a(?:b|c)a)|((?:a|b)ba)|(ab(?:a|c))");
Matcher m = p.matcher("aba");
System.out.println(m.matches());
System.out.println(m.groupCount());
for (int i = 0, n = m.groupCount(); i < n; i++) {
System.out.println(m.group(i));
}
}
}
बाहर
true
3
aba
aba
null
प्रिंट होगा आप देख सकते हैं केवल पहले समूह मिलान किया जाता है और मैं नहीं दिख रहा है दूसरे दो से मेल खाने का एक तरीका।
अधिक निष्कर्ष - उपरोक्त automaton लाइब्रेरी का उपयोग करके, समस्या निम्न को कम कर देगी: यदि आप दो या अधिक automatons को जोड़ते हैं, तो आप अंतिम स्थिति के लिए कैसे पहचान सकते हैं, जिसमें मूल automatons संबंधित है?
क्या आपने प्रत्येक 'एड एक्सप्रेशन' में नामित समूह जोड़ने पर विचार किया है? आप जांच सकते हैं कि कौन से मैच मेल खाते हैं। –
वे ध्वनि जो आपके पास जावा के लिए हैं। पर्ल में यह आसान होगा। आप बस सभी अभिव्यक्तियों को वैकल्पिक कर सकते हैं, और प्रत्येक अभिव्यक्ति (जिसे 'एक्स' कहा जाता है) के अंत में उदाहरण के लिए जोड़ें (? {$ मिलान {एक्स} = 1}) (?!) '। एक्सचेंज के रूप में अभिव्यक्ति 'एक्स' को चिह्नित करता है, और उसके बाद मैच में विफल रहता है, जिससे अन्य अभिव्यक्तियां भी मिलती हैं। (इसे अनुकूलित करने के लिए आप प्रत्येक अभिव्यक्ति को परमाणु कैप्चरिंग समूह में भी डाल सकते हैं।) – Qtax
@MichaelW: हाँ, मैंने इसे भी माना। समस्या यह है कि जावा में regexp केवल पहले समूह (नाम या अनाम) से मेल खाता है। –