2012-08-02 120 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

你是不是想在你的腳本中生成一個正則表達式?我不確定這個問題。在Java中,您需要使用另一個\例如匹配空格\\ s。不確定Scala語言。 – 2012-08-02 09:14:53

+1

當文本中不包含''+''時,它應該如何在''text''中找到''d +''(語法)? – 2012-08-02 09:15:34

+2

@ mhs:ups,錯字。但它仍然不起作用。 – 2012-08-02 09:38:19

回答

25

您可以使用Java的Pattern類將字符串轉義爲正則表達式。見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:String)=「」「\ Q」「」+ x +「」「\ E」「」'' – 2012-08-02 09:42:02

+4

在'scala.util.matching'中也有'Regex.quote'來做同樣的事事情。 – 2016-01-07 17:59:26

4

只是爲了讓更多人注意到哈羅德·L的評論上面,如果你想用Scala庫要做到這一點,你可以使用:

import scala.util.matching.Regex 
Regex.quote("123$").r.findFirstIn("123$") 
相關問題