2013-02-22 12 views
12

मैं एक बुनियादी एचटीएमएल पैटर्न के लिए एक स्ट्रिंग परीक्षण करने के लिए कोशिश कर रहा हूँ और यद्यपि मैं मीटर (बहु) संशोधक यह केवल काम करता है का उपयोग स्ट्रिंग एक 1-लाइनरClojure बहु नियमित अभिव्यक्ति

(re-find #"(?im)^<html>.*<body>.*</body>.*</html>" c)) 

विफल है जब:

"<html> <body> sad </body> 
    </html>" 

काम करता है:

"<html> <body> sad </body>  </html>" 

क्या मैं गलत कर रहा हूँ?

+1

मैं इसे यहां छोड़ दूंगा http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – mobyte

उत्तर

14

अस्वीकरण: मैं क्लोजर प्रोग्रामर नहीं हूं, लेकिन मुझे लगता है कि यह समस्या भाषा से स्वतंत्र है।

जब बहु लाइन मोड सक्षम होता है, कैरट ^ की व्याख्या और डॉलर $ परिवर्तन इस तरह: इसके बजाय शुरुआत और पूरे इनपुट स्ट्रिंग के अंत मिलान की, वे शुरुआत और अंत का मेल खाते हैं इनपुट स्ट्रिंग में प्रत्येक पंक्ति। यह है - जहां तक ​​मैं देख सकता हूं - जो आप चाहते हैं/नहीं।

आप जो चाहते हैं वह .* एस के लिए न्यूलाइन से मेल खाने के लिए है (वे डिफ़ॉल्ट रूप से क्या नहीं करते हैं) और यह सिंगल-लाइन मोड को सक्षम करके किया जा सकता है। तो इसका मतलब यह है:

(re-find #"(?is)^<html>.*<body>.*</body>.*</html>" c)) 

तुम भी RegExr पर इस की पुष्टि कर सकते हैं।

10

आपको (?s) "डॉटल मोड" switch का उपयोग करने की आवश्यकता है।

उदाहरण:

user=> (re-find #"\d{3}.\d{3}" "123\n456")  
nil 

user=> (re-find #"(?s)\d{3}.\d{3}" "123\n456") 
"123\n456" 

(?m) स्विच भ्रामक नाम है - यह दृश्य बदल जाता है ^ और $ एंकर करते हैं, उन्हें भी शुरू की लाइन और अंत लाइन क्रमश: मिलान करने के लिए अनुमति देता है - - जो आप नहीं चाहते हैं।

+0

धन्यवाद मैट! अन्य http://nakkaya.com/2009/10/25/regular-expressions-in-clojure/ उपयोगी भी हो सकते हैं। –

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