2012-08-02 14 views
18

के रूप में पारित करने के लिए एस्केप स्ट्रिंग को मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो इनपुट पर दिए गए मनमानी स्ट्रिंग से मेल खाने वाले रेगेक्स को बनाता है। उदाहरण के लिए, जब मैं 123$ के साथ इसे खिलाता हूं तो इसे स्ट्रिंग के अंत में सचमुच "123$" और 123से मेल खाना चाहिए।रेगेक्स

def convert(xs: String) = (xs map (x => "\\"+x)).mkString     

val text = """ 123 \d+ 567 """             
val x = """\d+"""                
val p1 = x.r                 
val p2 = convert(x).r               

println(p1.toString)              
    \d+ // regex to match number            

println((p1 findAllIn text).toList)          
    List(123, 567) // ok, numbers are matched         

println(p2.toString)              
    \\\d\+ // regex to match "backshash d plus"         

println((p2 findAllIn text).toList)          
    List() // nothing matched :(            

तो पिछले findAllIn पाठ में \d+ खोजना चाहिए, लेकिन ऐसा नहीं है। यहाँ क्या गलत है?

+0

आप कोशिश कर रहे हैं अपनी स्क्रिप्ट के भीतर एक regex उत्पन्न करने के लिए? मुझे सवाल का अनिश्चितता है। जावा में आपको किसी अन्य के साथ \ "से बचने की आवश्यकता है व्हाइट्स स्पेस मैच \\ एस। स्कैला भाषा का अनिश्चितता। –

+1

जब '' '' '' '' '' '' '' '' '' + '' '' \ d + '' (synactically) '' text'' में क्यों होना चाहिए? –

+2

@ एमएचएस: अप्स, टाइपो। लेकिन यह अभी भी काम नहीं करता है। –

उत्तर

25

आप नियमित अभिव्यक्तियों के रूप में तारों से बचने के लिए जावा की पैटर्न कक्षा का उपयोग कर सकते हैं। देखें http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote%28java.lang.String%29

उदाहरण के लिए:

scala> Pattern.quote("123$").r.findFirstIn("123$") 
res3: Option[String] = Some(123$) 
+3

धन्यवाद! काम करता है। 'def quote (x: स्ट्रिंग) =" "" \ Q "" "+ x +" "" \ E "" " –

+4

'scala.util.matching' में' Regex.quote' भी ऐसा करने के लिए है चीज़। –

4

बस ऊपर हेरोल्ड ल टिप्पणी का अधिक ध्यान लाने के लिए, यदि आप आप उपयोग कर सकते हैं एक स्काला पुस्तकालय के साथ ऐसा करना चाहते हैं:

import scala.util.matching.Regex 
Regex.quote("123$").r.findFirstIn("123$")