2011-10-24 12 views
17

मैं कुछ दस्तावेज या उम्र के लिए हास्केल नियमित अभिव्यक्तियों पर एक ट्यूटोरियल खोज रहा हूं। HaskellWiki page पर कोई उपयोगी जानकारी नहीं है।हास्केल में पीसीआरई - क्या, कहाँ, कैसे?

Documentation 
Coming soonish. 

, एक संक्षिप्त blog post जो मैं काफी उपयोगी पाया है नहीं है, लेकिन यह केवल POSIX रेगुलर एक्सप्रेशन, नहीं PCRE के साथ सौदों: यह बस गुप्त संदेश देता है।

मैं कुछ हफ्तों के लिए पॉज़िक्स रेगेक्स के साथ काम कर रहा हूं और मैं इस निष्कर्ष पर आ रहा हूं कि मेरे कार्य के लिए मुझे पीसीआरई की आवश्यकता है।

मेरी समस्या यह है कि मुझे नहीं पता कि हास्केल में पीसीआरई के साथ कहां से शुरू करना है। मैंने regex-pcre-builtin को कैबल के साथ डाउनलोड किया है लेकिन मुझे जाने के लिए एक आसान मिलान प्रोग्राम के उदाहरण की आवश्यकता है।

  • क्या बहु-लाइन मिलान लागू करना संभव है?
  • क्या मैं इस प्रारूप में मैचों को वापस प्राप्त कर सकता हूं: [(MatchOffset,MatchLength)]?
  • मैचों में मुझे कौन से अन्य प्रारूप मिल सकते हैं?

किसी भी मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

5

ठीक है, मैंने विकी पेज का अधिकांश लिखा है और शायद "जल्द ही आ रहा है" लिखा होगा। रेगेक्स-पिक पैकेज रीगेक्स-बेस इंटरफ़ेस का उपयोग करके पीसीआरई का मेरा लपेटन था, जहां कई अलग-अलग नियमित अभिव्यक्ति इंजन बैकएंडों के लिए इंटरफेस के रूप में रेगेक्स-बेस का उपयोग किया जाता है। डॉन स्टीवर्ट के पिक-लाइट पैकेज में इस अमूर्त परत नहीं है और इस प्रकार यह बहुत छोटा है।

टेक्स्ट.रेगेक्स.पोसिक्स पर ब्लॉग पोस्ट मेरे रेगेक्स-पॉज़िक्स पैकेज का उपयोग करता है जो रेगेक्स-बेस के शीर्ष पर भी है। इस प्रकार रेगेक्स-पिक्चर का उपयोग पीसीआरई के संकलन विकल्पों को & संकलन विकल्पों को छोड़कर, उस ब्लॉग पोस्ट के समान ही होगा।

regex-pcre को कॉन्फ़िगर करने के लिए Text.Regex.PCRE.Wrap module में स्थिरांक हैं जो आपको चाहिए। विकल्प निर्दिष्ट करने के लिए regex-base से makeRegexOptsM का उपयोग करें।

10

दो मुख्य विकल्प जब हास्केल में PCRE शैली regexes का उपयोग करना चाहते हैं:

  • regex-pcre, RWH में है कि ब्लॉग पोस्ट में वर्णित (और यह भी रूप में एक ही इंटरफ़ेस का उपयोग करता के रूप में मैं एक विस्तारित संस्करण लगता है उस ब्लॉग पोस्ट के); इसे वैकल्पिक रूप से pcre-less के साथ बढ़ाया जा सकता है। regex-pcre-builtin इस के प्री-रिलीज स्नैपशॉट प्रतीत होता है और शायद इसका उपयोग नहीं किया जाना चाहिए।

  • pcre-light पीसीआरई पुस्तकालय के लिए बाध्यकारी है। यह आपके द्वारा किए जाने वाले रिटर्न प्रकार प्रदान नहीं करता है, बस सभी मिलान (यदि कोई हो)। हालांकि, pcre-light-extras पैकेज MatchResult क्लास प्रदान करता है, जिसके लिए आप ऐसा उदाहरण प्रदान कर सकते हैं। इसे regexqq का उपयोग करके बढ़ाया जा सकता है जो आपको यह सुनिश्चित करने के लिए अर्ध-उद्धरण का उपयोग करने की अनुमति देता है कि आपका रेगेक्स पैटर्न प्रकार-जांच; हालांकि, यह जीएचसी -7 के साथ काम नहीं करता है (और जब तक कोई इसे बनाए रखने के लिए नहीं लेता है, तो यह नहीं होगा)। ,

    • this जवाब के अनुसार हाँ:

    तो, यह सोचते हैं कि आप regex-pcre साथ जाना।

  • मुझे लगता है कि MatchArray प्रकार के माध्यम से (यह एक सरणी देता है, जिसे आप सूची से बाहर निकाल सकते हैं)।

  • रेगेक्स से सभी संभावित परिणामों के लिए here देखें।

+0

मुझे बहु-पंक्ति मिलान के लिए उस विधि को आजमाते समय 'स्कोप में नहीं' compNewLine 'त्रुटि मिल रही है। मुझे लगता है कि यह केवल Posix के लिए काम करता है। –

+0

@ निकबंट [compMultiline] (http://hackage.haskell.org/packages/archive/regex-pcre/0.94.2/doc/html/Text-Regex-PCRE-Wrap.html#v:compMultiline) शायद तब? – ivanm

+0

क्या पिक्चर-लाइट-एक्स्ट्रा एक विरोधाभास नहीं है? – mcandre

5

regexpr एक और PCRE-ish lib पार मंच और त्वरित साथ आरंभ करने के लिए कर रही है।

9

regex-applicative भी मैंने लिखा है।

विचार यह है कि आप नियमित अभिव्यक्ति के प्रत्येक टुकड़े को कुछ अर्थ निर्दिष्ट कर सकते हैं और फिर उन्हें लिख सकते हैं, जैसे आप पारसेक का उपयोग कर पार्स लिखते हैं।

यहां एक उदाहरण है - सरल यूआरएल पार्सिंग।

import Text.Regex.Applicative 

data Protocol = HTTP | FTP deriving Show 

protocol :: RE Char Protocol 
protocol = HTTP <$ string "http" <|> FTP <$ string "ftp" 

type Host = String 
type Location = String 
data URL = URL Protocol Host Location deriving Show 

host :: RE Char Host 
host = many $ psym $ (/= '/') 

url :: RE Char URL 
url = URL <$> protocol <* string "://" <*> host <* sym '/' <*> many anySym 

main = print $ "http://stackoverflow.com/questions" =~ url 
+1

ओहोह, यह अच्छा लग रहा है! – ivanm

2

मैं rex खोजने के भी काफी अच्छा हो सकता है, इसकी ViewPatterns एकीकरण एक अच्छा विचार मुझे लगता है कि है।

हालांकि यह वर्बोज़ हो सकता है लेकिन यह आंशिक रूप से रेगेक्स अवधारणा से जुड़ा हुआ है।

parseDate :: String -> LocalTime 
parseDate [rex|(?{read -> year}\d+)-(?{read -> month}\d+)- 
     (?{read -> day}\d+)\s(?{read -> hour}\d+):(?{read -> mins}\d+): 
     (?{read -> sec}\d+)|] = 
    LocalTime (fromGregorian year month day) (TimeOfDay hour mins sec) 
parseDate [email protected]_ = error $ "invalid date " ++ v 

कहा मैं तो बस की खोज की regex-अनुप्रयोगी अन्य उत्तर में से एक में उल्लेख किया है और यह एक बेहतर विकल्प है, कम वर्बोज़ और अधिक मुहावरेदार हो सकता है हो सकता है, हालांकि रेक्स मूल रूप से शून्य सीखने की अवस्था यदि आप नियमित अभिव्यक्ति पता है जो एक प्लस हो सकता है।

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