2011-12-14 13 views
5

मुझे हैकेल में रेगेक्स के साथ कुछ परेशानी हो रही है। विशेष रूप से:हास्केल रेगेक्स सिंटैक्स

Prelude Text.Regex.Posix> "1" =~ "\d" :: Bool 
<interactive>:1:10: 
    lexical error in string/character literal at character 'd' 
Prelude Text.Regex.Posix> "1" =~ "\\d" :: Bool 
False 
Prelude Text.Regex.Posix> "1" =~ "\\\\d" :: Bool 
False 

हास्केल \d या \s या अन्य ऐसे सुविधाजनक मुक्ति कोड नहीं है? हां, मुझे पता है कि मैं इसके बजाय [0-9] कर सकता हूं, लेकिन बचने के कोड जटिल regexes के लिए इतना अधिक भरोसेमंद हो सकता है। क्या में यहां कुछ भूल रहा हूँ?

+0

यह एक उदाहरण समाधान देखना बहुत अच्छा होगा जो वास्तव में '\\ d' से मेल खाता है या इसके कुछ संस्करण के रूप में मैं अभी भी –

उत्तर

8

मुझे हास्केल रेगेक्स पैकेज के बारे में बहुत कुछ पता नहीं है, लेकिन "Text.Regex.Posix" के साथ उपरोक्त आपके उदाहरणों से, मुझे लगता है कि आप POSIX नियमित अभिव्यक्तियों में काम कर रहे हैं। एस्केप अनुक्रम जैसे कि \ d और \ s POSIX regex वाक्यविन्यास का हिस्सा नहीं हैं, और मेरा मानना ​​है कि पर्ल के साथ उत्पत्ति हुई है और तब से अन्य भाषाओं में प्रचारित है।

+0

कूल संघर्ष कर रहा हूं, मुझे नहीं पता था कि यह मामला था। – So8res

+0

'Text.Regex.Posix' मॉड्यूल POSIX regex सी एपीआई में विदेशी फ़ंक्शन बाइंडिंग का उपयोग करता है, मुझे विश्वास है। तो आप बहुत सही हैं। –

14

नहीं, हास्केल में \d और \s जैसे बचने के अनुक्रम नहीं हैं। अर्थात। भाषा हास्केल में उनके पास नहीं है। क्योंकि भाषा हास्केल को नियमित अभिव्यक्तियों के लिए भी कोई समर्थन नहीं है। केवल कुछ पुस्तकालय हैं जो नियमित अभिव्यक्ति प्रदान करते हैं।

इसलिए, आपको देखना है कि क्या रेगेक्स लाइब्रेरी आप उपयोग कर रहे हैं, \d और \s का समर्थन करता है। और जब वे इसका समर्थन करते हैं, तो आपको उन्हें Haskell स्रोत फ़ाइल में "\\d" के रूप में लिखना होगा।

जब \d पर्ल से उपजी है तो आप regex-pcre के साथ अधिक सफल हो सकते हैं।

+0

+1 इंगित करने के लिए कि रेगेक्स लाइब्रेरी सामान हैं और '\\ d' पर संकेत दे रहे हैं – scravy