2010-03-17 14 views
10

Sto cercando di abbinare in un gruppo di opzioni in Scala 2.8 (beta 1) con il seguente codice:Scala: Corrispondenza opzionali gruppi di espressioni regolari

import scala.xml._ 

val StatementPattern = """([\w\.]+)\s*:\s*([+-])?(\d+)""".r 

def buildProperty(input: String): Node = input match { 
    case StatementPattern(name, value) => <propertyWithoutSign /> 
    case StatementPattern(name, sign, value) => <propertyWithSign /> 
} 

val withSign = "property.name: +10" 
val withoutSign = "property.name: 10" 

buildProperty(withSign)  // <propertyWithSign></propertyWithSign> 
buildProperty(withoutSign)  // <propertyWithSign></propertyWithSign> 

Ma questo non sta funzionando. Qual è il modo corretto per abbinare i gruppi di espressioni regolari facoltative?

risposta

17

Il gruppo opzionale sarà nullo se non è abbinato quindi è necessario includere "null" nella partita modello:

import scala.xml._ 

val StatementPattern = """([\w\.]+)\s*:\s*([+-])?(\d+)""".r 

def buildProperty(input: String): Node = input match { 
    case StatementPattern(name, null, value) => <propertyWithoutSign /> 
    case StatementPattern(name, sign, value) => <propertyWithSign /> 
} 

val withSign = "property.name: +10" 
val withoutSign = "property.name: 10" 

buildProperty(withSign)  // <propertyWithSign></propertyWithSign> 
buildProperty(withoutSign)  // <propertyWithSign></propertyWithSign> 
+1

Scala usa il metodo Matcher.group in Regex.unapplySeq. Questo specifica che se un gruppo non riesce ad abbinare parte della sequenza, viene restituito null -

+2

Sarebbe bello se Scala potesse usare una classe Option per un campo regex opzionale piuttosto che richiedere un controllo Null. –

0

Non vedo alcun problema con il tuo regex. Sebbene non sia necessario sfuggire allo . nella classe char.

EDIT:

Si può provare qualcosa di simile:

([\w.]+)\s*:\s*((?:+|-)?\d+) 

Per catturare il nome e il valore in cui il valore può avere un segno opzionale.

+0

@codaddict grazie per la segnalazione;) La regex va bene, il problema non riesco a vedere chi abbinare il gruppo opzionale utilizzando il sistema di corrispondenza del modello Scala. E non riesco a trovare esempi per farlo in rete –

+0

@codaaddict Grazie, il mio codice funzionerà, ma la domanda di corrispondenza del modello Scala rimane ancora :) In realtà ho bisogno di XML diversi a seconda che ci sia o non sia un segno , quindi usare il sistema di corrispondenza dei modelli per estrarre e verificare se c'è un segno mi sembra la soluzione più pulita per me –

Problemi correlati