2011-04-08 19 views
16

हास्केल में नियमित अभिव्यक्तियों का उपयोग करके मैं स्ट्रिंग कैसे निकाल सकता हूं?हैकेल नियमित अभिव्यक्तियों में समूहांकन

let x = "xyz abc" =~ "(\\w+) \\w+" :: String 

कि घटना एक मैच

let x = "xyz abc" =~ "(.*) .*" :: String 

यही करती है, लेकिन एक्स के रूप में "xyz abc" कैसे मैं केवल प्रथम regex समूह ताकि एक्स "xyz" है निकालने करते समाप्त होता है नहीं मिलता है?

उत्तर

18

मैंने लिखा/regex-base, regex-pcre, और regex-tdfa के रूप में इस तरह के पैकेज बनाए रखें।

रीजिक्स-बेस Text.Regex.Base.Context मॉड्यूल दस्तावेजों में RegexContext की बड़ी संख्या के उदाहरण = ~ उपयोग करता है। ये RegexLike के शीर्ष पर लागू किए गए हैं जो matchText और matchAllText को कॉल करने के लिए अंतर्निहित तरीका प्रदान करते हैं।

[[स्ट्रिंग]] कि केनीटीएम उल्लेख रेगेक्स कॉन्टेक्स्ट का एक और उदाहरण है, और हो सकता है कि वह आपके लिए सबसे अच्छा काम न करे।

let x :: Array Int (MatchText String) 
    x = getAllTextMatches $ "xyz abc" =~ "(\\w+) \\w+" 

, जिसके आधार पर एक्स समूह-मैचों में से किसी सरणी इंट के मैचों में से किसी सरणी इंट है: एक व्यापक उदाहरण

RegexContext a b (AllTextMatches (Array Int) (MatchText b)) 

type MatchText source = Array Int (source, (MatchOffset, MatchLength)) 

जो सब कुछ के लिए एक MatchText प्राप्त करने के लिए इस्तेमाल किया जा सकता है।

ध्यान दें कि "\ w" पर्ल सिंटैक्स है इसलिए आपको इसे एक्सेस करने के लिए regex-pcre की आवश्यकता है। यदि आप यूनिक्स/पॉज़िक्स को नियमित अभिव्यक्तियों को विस्तारित करना चाहते हैं तो आपको रेगेक्स-टीडीएफए का उपयोग करना चाहिए जो क्रॉस-प्लेटफ़ॉर्म है और regex-posix का उपयोग करने से बचें जो regex.h लाइब्रेरी को लागू करने में प्रत्येक प्लेटफ़ॉर्म की बग को हिट करता है।

ध्यान दें कि पर्ल बनाम पॉज़िक्स सिर्फ "\ w" जैसे सिंटैक्स का मामला नहीं है। वे बहुत अलग एल्गोरिदम का उपयोग करते हैं और अक्सर अलग-अलग परिणाम लौटाते हैं। इसके अलावा, समय और अंतरिक्ष जटिलता बहुत अलग हैं। लम्बाई 'एन' पर्ल शैली (रेगेक्स-पिक्चर) की स्ट्रिंग के खिलाफ मिलान करने के लिए समय में ओ (एक्सपी (एन)) हो सकता है जबकि रीजिक्स-पॉजिक्स का उपयोग कर पॉज़िक्स शैली हमेशा समय में ओ (एन) होती है।

13

परिणाम को [[String]] के रूप में कास्ट करें। फिर आपको मैचों की एक सूची मिल जाएगी, प्रत्येक मिलान किए गए पाठ की सूची और कब्जे वाले उपसमूहों की सूची होगी।

Prelude Text.Regex.PCRE> "xyz abc more text" =~ "(\\w+) \\w+" :: [[String]] 
[["xyz abc","xyz"],["more text","more"]] 
संबंधित मुद्दे