2013-08-13 3 views
6

Soweit ich aus den Dokumenten sehen kann, sind nicht erfassende Gruppen durch (:?) Definiert, wie in Java. (Ich glaube, es ist die gleiche zugrunde liegende Bibliothek).Ist es möglich, nicht einfangende Gruppen in scala Regexes zu arbeiten, wenn Mustererkennung

Doch dies scheint nicht zu funktionieren:

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

returns "b" (wenn es sollte leer sein). Ich vermute, dies normalerweise kein Problem, aber wenn Mustervergleich zu tun, bedeutet es, dass ich jetzt nicht tun kann:

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

ich zu tun habe:

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

Gibt es eine Möglichkeit zu machen diese Arbeit "wie erwartet"?

Antwort

7

Neben der richtigen Antwort, val und parens verwenden:

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 

Sie können auch immer die Platzhalterfolge verwenden und es ist nicht wichtig, ob Sie Erfassungsgruppen angegeben haben. Ich habe das kürzlich entdeckt und finde es am klarsten und robustesten.

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

Wenn alles passt, _*, darunter einen Extraktor Some(null) zurück.

+0

Das ist toll - liebe den _ * Style. (Mit var und drop parens waren Fehler bei der Erstellung eines kanonischen Beispiels. Entschuldigung!) –

3

Es scheint, dass Sie die Syntax falsch haben. Sollte sein (?:).

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

Gruppen beginnend mit (? Sind reine, nicht-einfangende Gruppen, die auf die Gruppe insgesamt nicht Text erfassen und zählen nicht.

+0

Danke für den Link! Ich kann nicht glauben, dass ich das falsch herum gesehen habe. Und dann funktioniert es natürlich als genau die selbe Gruppe, aber Capturen, mit einem optionalen Doppelpunkt am Anfang ... –

Verwandte Themen