2012-08-02 30 views
18

Tôi muốn tạo một hàm tạo regex khớp với chuỗi tùy ý được cung cấp tại đầu vào. Ví dụ: khi tôi cho nó ăn với 123$, nó phải khớp với nghĩa là "123$" và không phải 123ở cuối chuỗi.Chuỗi thoát được chuyển thành regex

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 :(            

Vì vậy, cuối cùng findAllIn nên tìm \d+ trong văn bản, nhưng nó không. Có gì sai ở đây?

+0

bạn đang cố gắng thế nào để tạo ra một regex trong kịch bản của bạn? Tôi không chắc chắn về câu hỏi. Trong Java, bạn cần phải thoát \ bằng cách khác \ ví dụ: khớp khoảng trắng \\ s. Không chắc chắn về ngôn ngữ scala. –

+1

Làm thế nào nó sẽ tìm thấy '' \ d + '' (cú pháp) trong '' văn bản'' khi sau này không chứa '' + ''? –

+2

@mhs: ups, typo. Nhưng nó vẫn không hoạt động. –

Trả lời

25

Bạn có thể sử dụng lớp Mẫu của Java để thoát khỏi chuỗi dưới dạng cụm từ thông dụng. Xem http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote%28java.lang.String%29

Ví dụ:

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

Cảm ơn! công trinh. 'def quote (x: String) =" "" \ Q "" "+ x +" "" \ E "" "' –

+4

Trong 'scala.util.matching' cũng có' Regex.quote' để làm tương tự Điều. –

4

Chỉ cần mang ý nhiều hơn đến Harold L's bình luận ở trên, nếu bạn muốn làm điều này với một thư viện Scala bạn có thể sử dụng:

import scala.util.matching.Regex 
Regex.quote("123$").r.findFirstIn("123$") 
Các vấn đề liên quan