2010-03-17 7 views
10

Je suis en train de faire correspondre à un groupe d'options Scala 2.8 (beta 1) avec le code suivant:Scala: Matching en option des groupes d'expression réguliers

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> 

Mais cela ne fonctionne pas. Quelle est la bonne façon de faire correspondre les groupes regex optionnels?

Répondre

17

Le groupe facultatif sera nulle si elle ne correspond pas si vous devez inclure « null » dans la correspondance de motif:

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 utilise la méthode Matcher.group dans Regex.unapplySeq. Cela spécifie que si un groupe ne correspond pas à une partie de la séquence, la valeur null est renvoyée -

+2

Ce serait bien si Scala pouvait utiliser une classe Option pour un champ regex optionnel au lieu d'exiger une vérification nulle. –

0

Je ne vois aucun problème avec votre regex. Bien que vous n'ayez pas besoin d'échapper à la . dans la classe char.

EDIT:

Vous pouvez essayer quelque chose comme:

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

Pour saisir le nom et la valeur où la valeur peut avoir un signe optionnel.

+0

@codaddict Merci de remarquer que sur;) Le regex est très bien, le problème est je ne peux pas voir qui faire correspondre le groupe facultatif en utilisant le système de correspondance de modèle Scala. Et je ne peux trouver aucun exemple pour le faire sur le net –

+0

@codaaddict Merci, cela va faire fonctionner mon code, mais la question de correspondance de modèle Scala reste encore :) J'ai réellement besoin de XML différent selon qu'il y a ou non un signe , donc utiliser le système de recherche de formes pour extraire et tester s'il y a un signe me semble la solution la plus propre –