2013-08-13 17 views
6

Z tego, co widzę z dokumentów, grupy niezapisujące są zdefiniowane przez (:?), Tak jak w Javie. (Wierzę, że to ta sama podstawowa biblioteka).Czy możliwe jest tworzenie grup niezapisujących w wyrażeniach regularnych scala podczas dopasowywania wzorca

Jednak to nie wydają się działać:

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

powroty "B" (a powinien być pusty). Podejrzewam, że to nie jest zwykle problemem, ale gdy robi pasujące do wzorca, to znaczy, że nie mogę teraz zrobić:

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

mam zrobić:

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

Czy istnieje jakiś sposób, aby ta praca "zgodnie z oczekiwaniami"?

Odpowiedz

7

oprócz poprawnej odpowiedzi, użyj wartości val i 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 

Zawsze możesz również użyć sekwencji wieloznacznej i nie przejmuj się, czy określono grupy przechwytujące. Odkryłem to niedawno i stwierdziłem, że jest ono najbardziej jasne i niezawodne.

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

Jeśli wszystko się zgadza, _* wola, w tym wyciąg powracającego Some(null).

+0

To świetnie - uwielbiam styl _ *. (używanie var i upuszczanie paren były błędami w robieniu kanonicznego przykładu. Przepraszamy!) –

3

Wygląda na to, że masz błędną składnię. Powinno być (?:).

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

Grupy rozpoczynające się (? Są czyste, nie-robienia grupy, które nie oddają tekst i nie liczą się do całej grupy.

+0

Dzięki za link! Nie mogę uwierzyć, że źle to rozumiem. I oczywiście wtedy działa jako dokładnie ta sama grupa, ale przechwytująca, z opcjonalnym dwukropkiem na początku ... –

Powiązane problemy