2010-10-02 17 views
21

regex की हास्यास्पद बड़ी संख्या हास्केल के लिए इंजन मिलान के बावजूद, केवल एक ही मुझे लगता है कि होगा स्थानापन्नText.Regex, जो है, जबकि सभ्य, कुछ बात याद आ रही है मैं PCRE से चाहते है पा सकते हैं। क्या कोई पिक्चर-आधारित पैकेज है जो प्रतिस्थापन करेगा, या क्या मैं इसके साथ अटक गया हूं?Haskell regex प्रतिस्थापन

+2

अच्छा सवाल है, मैंने एक ही समस्या में भाग लिया है। –

+2

ठीक है, स्क्रू करें, मैंने अपना खुद का टेक्स्ट 'टेक्स्ट.रेगेक्स.पीसीआरई.लाइट' पर आधारित लिखा है, हालांकि यह अधिकांश अन्य कार्यान्वयन के लिए अच्छी तरह से बंदरगाहों को बंद करता है। – muhmuhten

+5

उत्तर के रूप में पोस्ट करें अगर यह समस्या हल करता है। – kennytm

उत्तर

3

रेगेक्स-बेस में नियमित अभिव्यक्ति API मिलान करने के लिए वर्णों के कंटेनर के लिए सामान्य है। प्रतिस्थापन लागू करने के लिए सामान्य रूप से किसी प्रकार का विभाजन करना कुशल बनाना मुश्किल होगा। मैं एक क्रैपी जेनेरिक दिनचर्या प्रदान नहीं करना चाहता था।

प्रतिस्थापन करने के लिए एक छोटा सा फ़ंक्शन लिखना वास्तव में एक बेहतर विचार है, और यह आपके कंटेनर से मेल खाने के लिए लिखा जा सकता है।

4

मुझे नहीं लगता कि "बस अपना खुद का रोल करें" वास्तविक कार्य करने की कोशिश करने वाले लोगों के लिए एक उचित उत्तर है, ऐसे क्षेत्र में जहां हर दूसरी आधुनिक भाषा ऐसा करने का एक छोटा तरीका है। योजना सहित। तो यहां कुछ वास्तविक संसाधन हैं; मेरा कोड एक प्रोजेक्ट से है जहां मैं qq "brackets" के अंदर सामान पर फ़ंक्शन को कॉल करने के आधार पर पाठ के साथ "qql foo bar baz qq" को प्रतिस्थापित करने का प्रयास कर रहा था, क्योंकि कारण।

सर्वश्रेष्ठ विकल्प: PCRE भारी:

 let newBody = gsub [re|\s(qq[a-z]+)\s(.*?)\sqq\s|] (unWikiReplacer2 titles) body in do 
[snip] 
unWikiReplacer2 :: [String] -> String -> [String] -> String 
unWikiReplacer2 titles match subList = case length subList > 0 of 
     True -> " --" ++ subList!!1 ++ "-- " 
     False -> match 

ध्यान दें कि PCRE भारी सीधे किसी भी स्ट्रिंग प्रकार के साथ, समारोह आधारित प्रतिस्थापन का समर्थन करता है। बहुत अच्छा।

एक अन्य विकल्प:

let newBody = replaceAllPCRE "\\s(qq[a-z]+)\\s(.*?)\\sqq\\s" (unWikiReplacer titles) body in do 
[snip] 
unWikiReplacer :: [String] -> (PCRE.MatchResult String) -> String 
unWikiReplacer titles mr = case length subList > 0 of 
     True -> " --" ++ subList!!1 ++ "-- " 
     False -> PCRE.mrMatch mr 
    where 
     subList = PCRE.mrSubList mr 

-- A very simple, very dumb "replace all instances of this regex 
-- with the results of this function" function. Relies on the 
-- MatchResult return type. 
-- 
-- https://github.com/erantapaa/haskell-regexp-examples/blob/master/RegexExamples.hs 
-- was very helpful to me in constructing this 
-- 
-- I also used 
-- https://github.com/jaspervdj/hakyll/blob/ea7d97498275a23fbda06e168904ee261f29594e/src/Hakyll/Core/Util/String.hs 
replaceAllPCRE :: String    --^Pattern 
      -> ((PCRE.MatchResult String) -> String) --^Replacement (called on capture) 
      -> String    --^Source string 
      -> String    --^Result 
replaceAllPCRE pattern f source = 
    if (source PCRE.=~ pattern) == True then 
     replaceAllPCRE pattern f newStr 
    else 
     source 
    where 
     mr = (source PCRE.=~ pattern) 
     newStr = (PCRE.mrBefore mr) ++ (f mr) ++ (PCRE.mrAfter mr) 

किसी और के द्वारा ठीक: http://0xfe.blogspot.com/2010/09/regex-substitution-in-haskell.html

एक और एक, इस बार एक बड़ा पुस्तकालय में एम्बेडेड एक छोटे से समारोह है कि लेकिन काम करता है के साथ PCRE प्रकाश बिल्कुल performant नहीं है : https://github.com/jaspervdj/hakyll/blob/master/src/Hakyll/Core/Util/String.hs

इस उद्देश्य के लिए एक और पैकेज: https://hackage.haskell.org/package/pcre-utils

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