2010-03-17 26 views
10

Estoy tratando de igualar en un grupo de opciones en Scala 2.8 (beta 1) con el siguiente código:Scala: Coincidencia de los grupos de expresiones regulares opcionales

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> 

Pero esto no está funcionando. ¿Cuál es la forma correcta de unir grupos regex opcionales?

Respuesta

17

El grupo opcional será nula si no se corresponde con lo que es necesario incluir "nulo" en el partido patrón:

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 el método Matcher.group en Regex.unapplySeq. Esto especifica que si un grupo no puede coincidir con parte de la secuencia, se devuelve null -

+2

Sería bueno si Scala pudiera usar una clase Option para un campo regex opcional en lugar de requerir una verificación nula. –

0

No veo ningún problema con su expresión regular. Aunque no necesita escapar del . en la clase char.

EDIT:

Usted puede intentar algo como:

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

Para capturar el nombre y valor, donde el valor puede tener un signo opcional.

+0

@codaddict gracias por señalarlo;) La expresión regular está muy bien, el problema es que no puedo ver con quién coincidir con el grupo opcional usando el sistema de coincidencia de patrones de Scala. Y no puedo encontrar ejemplos para hacerlo en la red –

+0

@codaaddict Gracias, eso hará que mi código funcione, pero la pregunta de coincidencia de patrón Scala aún permanece :) De hecho, necesito XML diferente en función de si hay o no un signo , entonces, usar el sistema de coincidencia de patrones para extraer y probar si hay un signo me parece la solución más limpia –

Cuestiones relacionadas