2013-08-13 10 views
6

Per quanto posso vedere dai documenti, i gruppi non di acquisizione sono definiti da (:?), Come in Java. (Credo che sia la stessa libreria sottostante).È possibile eseguire gruppi di non cattura in scala regexes quando il pattern corrisponde a

Tuttavia, questo non sembra funzionare:

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

restituisce "b" (quando dovrebbe essere vuoto). Ho il sospetto che questo non è normalmente un problema, ma quando si fa il pattern matching, vuol dire che non posso fare ora:

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

che devo fare:

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

non v'è alcun modo per rendere questo lavoro "come previsto"?

risposta

7

Oltre alla risposta corretta, utilizzare val e parentesi:

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 

È possibile anche utilizzare sempre la sequenza di caratteri jolly e non importa se si è specificato gruppi di cattura. L'ho scoperto recentemente e lo trovo più chiaro e robusto.

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

Semmai corrisponde, _* volontà, tra cui un estrattore ritorno Some(null).

+0

È grandioso: adoro lo stile _ *. (usare var e far cadere i paren erano errori nel fare un esempio canonico. –

3

Sembra che tu abbia sbagliato la sintassi. Dovrebbe essere (?:).

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

gruppi che iniziano con (? Sono puri, gruppi non-cattura che non catturano il testo e non contano ai fini del totale del gruppo.

+0

Grazie per il collegamento! Non posso credere di averlo fatto nel modo sbagliato. E, naturalmente, funziona esattamente come lo stesso gruppo, ma acquisendo, con un colon opzionale all'inizio ... –

Problemi correlati