2013-08-13 34 views
6

Theo như tôi thấy từ các tài liệu, các nhóm không bắt được xác định bởi (:?), Như trong Java. (Tôi tin rằng đó là cùng một thư viện cơ bản).Có thể làm cho các nhóm không bắt giữ hoạt động trong các quy trình scala khi mô hình phù hợp với

Tuy nhiên, điều này dường như không làm việc:

var R = "a(:?b)c".r 
R.findFirstMatchIn("abc").get.group(1) 

lợi nhuận "b" (khi nó phải được trống). Tôi nghi ngờ đây không phải là bình thường một vấn đề, nhưng khi thực hiện mô hình kết hợp, nó có nghĩa là tôi không thể bây giờ làm:

"abc" match {case R => println("ok");case _ => println("not ok")} 
> not ok 

tôi phải làm:

"abc" match {case R(x) => println("ok");case _ => println("not ok")} 
> ok 

Có cách nào để làm cho công việc này "như mong đợi"?

Trả lời

7

Ngoài các câu trả lời đúng, sử dụng val và parens:

scala> val R = "a(?:b)c".r // use val 
R: scala.util.matching.Regex = a(?:b)c 

scala> "abc" match {case R() => println("ok");case _ => println("not ok")} // parens not optional 
ok 

Bạn luôn có thể sử dụng chuỗi ký tự đại diện và không quan tâm bạn có chỉ định nhóm chụp hay không. Tôi phát hiện ra điều này gần đây và thấy nó rõ ràng và mạnh mẽ nhất.

scala> "abc" match {case R(_*) => println("ok");case _ => println("not ok")} 
ok 

Nếu có gì phù hợp, _* sẽ, bao gồm bộ chiết trả lại Some(null).

+0

Điều đó thật tuyệt - yêu thích phong cách _ *. (bằng cách sử dụng var và thả parens là những sai lầm trong việc đưa ra một ví dụ kinh điển. Xin lỗi!) –

3

Dường như bạn đã sai cú pháp. Nên là (?:).

http://docs.oracle.com/javase/tutorial/essential/regex/groups.html

Nhóm bắt đầu với (? Là tinh khiết, nhóm phi chụp mà không chụp văn bản và không được tính vào tổng số nhóm.

+0

Cảm ơn bạn đã liên kết! Không thể tin rằng tôi đã làm sai đường tròn. Và tất nhiên sau đó nó hoạt động như chính xác cùng một nhóm, nhưng chụp, với một tràng tùy chọn ở đầu ... –