2013-06-15 4 views
9

में मल्टीलाइन रेगेक्स कैप्चर मैं एक मल्टीलाइन रेगेक्स से सामग्री को कैप्चर करने की कोशिश कर रहा हूं। यह मेल नहीं खाता है।स्कैला

val text = """<p>line1 
    line2</p>""" 

val regex = """(?m)<p>(.*?)</p>""".r 

var result = regex.findFirstIn(text).getOrElse("") 

खाली लौटाता है।

मैंने एम-फ्लैग को मल्टीलाइन के लिए रखा लेकिन यह इस मामले में मदद नहीं करता है।

यदि मैं रेखा को रीजिक्स कार्यों को तोड़ देता हूं।

मुझे this भी मिला लेकिन यह काम नहीं कर सका।

मैं <p> तत्वों के बीच सामग्री कैसे मेल करूं? मैं सबकुछ चाहता हूं, लाइन ब्रेक भी।

अग्रिम धन्यवाद!

+1

सामान्य सलाह के रूप में, http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags इंगित करता है यह हो सकता है अधिकतर मामलों में HTML को पार्स करने के लिए रेगेक्स का उपयोग न करें। – Martijn

उत्तर

20

आप स्केला में dotall मोड को सक्रिय करना चाहते हैं, तो आप का मतलब है (?s) के बजाय (?m)

(?s) का उपयोग करना चाहिए डॉट नई-पंक्तियों

(?m) मतलब है ^ और शुरुआत के लिए $ स्टैंड और लाइनों

के अंत से मिलान कर सकते
+0

यूप ... '(? एम)' '^' और '$' के व्यवहार को बदल देगा। भ्रमित नाम;) – fge

+0

@fge भ्रमित लेकिन एम = बहु, एस = एकल लाइन। –

+1

कुछ ऐसा जो मुझे थोड़ा सा महसूस करने के लिए ले गया, और मेरे आवेदन के लिए आवश्यक था: एम और एस पारस्परिक रूप से अनन्य नहीं हैं। आपके पास (? एमएस) हो सकता है और यह काम करेगा जैसे आप उम्मीद करेंगे। – Sushisource

5

यदि यह इस बिंदु पर स्पष्ट नहीं है, "मैं सामग्री से कैसे मेल करूं":

scala> val regex = """(?s)<p>(.*?)</p>""".r 

scala> (regex findFirstMatchIn text).get group 1 
res52: String = 
line1 
    line2 

अधिक मुहावरे,

scala> text match { case regex(content) => content } 
res0: String = 
line1 
    line2 

scala> val embedded = s"stuff${text}morestuff" 
embedded: String = 
stuff<p>line1 
    line2</p>morestuff 

scala> val regex = """(?s)<p>(.*?)</p>""".r.unanchored 
regex: scala.util.matching.UnanchoredRegex = (?s)<p>(.*?)</p> 

scala> embedded match { case regex(content) => content } 
res1: String = 
line1 
    line2