转义字符串作为正则表达式传递

Jak*_* M. 21 regex scala

我想创建一个函数,创建正则表达式匹配输入时给定的任意字符串.例如,当我用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 :(                                               
Run Code Online (Sandbox Code Playgroud)

所以最后findAllIn应该\d+在文本中找到,但事实并非如此.这有什么不对?

Kim*_*bel 29

您可以使用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$)
Run Code Online (Sandbox Code Playgroud)

  • 在`scala.util.matching`中还有`Regex.quote`来做同样的事情. (7认同)
  • 谢谢!作品.`def quote(x:String)="""\ Q"""+ x +"""\ E"""` (4认同)

Bri*_*eau 7

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

import scala.util.matching.Regex
Regex.quote("123$").r.findFirstIn("123$")
Run Code Online (Sandbox Code Playgroud)