Escape string, которая должна быть передана как регулярное выражение

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+ в тексте, но это не так. Что здесь не так?

    
задан Jakub M. 02.08.2012 в 11:06
источник

2 ответа

25

Вы можете использовать класс шаблона Java для исключения строк в виде регулярных выражений. См. Ссылка

Например:

scala> Pattern.quote("123$").r.findFirstIn("123$")
res3: Option[String] = Some(123$)
    
ответ дан Kim Stebel 02.08.2012 в 11:27
  • Спасибо! работает. def quote (x: String)="" "\ Q" "" + x + "" "\ E" "" –  Jakub M. 02.08.2012 в 11:42
  • В scala.util.matching есть также Regex.quote, чтобы сделать то же самое. –  Harold L 07.01.2016 в 18:59
4

Чтобы обратить внимание на комментарий Гарольда Л. выше, если вы хотите сделать это с помощью библиотеки Scala, вы можете использовать:

import scala.util.matching.Regex
Regex.quote("123$").r.findFirstIn("123$")
    
ответ дан Brideau 28.05.2017 в 19:33