25

我想创建一个函数来创建与输入中给出的任意字符串匹配的正则表达式。例如,当我用它喂它时,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+在文本中找到,但它没有。这里有什么问题?

4

2 回答 2

32

您可以使用 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$)
于 2012-08-02T09:27:47.200 回答
10

只是为了更多地关注 Harold L 上面的评论,如果你想使用 Scala 库来做到这一点,你可以使用:

import scala.util.matching.Regex
Regex.quote("123$").r.findFirstIn("123$")
于 2017-05-28T17:33:35.483 回答