Scala: сопоставление необязательных групп регулярных выражений - PullRequest
14 голосов
/ 17 марта 2010

Я пытаюсь сопоставить группу опций в Scala 2.8 (бета 1) со следующим кодом:

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>

Но это не работает. Как правильно сопоставить необязательные группы регулярных выражений?

Ответы [ 2 ]

20 голосов
/ 17 марта 2010

Необязательная группа будет нулевой, если она не совпадает, поэтому вам нужно включить "нулевое" в совпадение с шаблоном:

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>
0 голосов
/ 17 марта 2010

Я не вижу никаких проблем с вашим регулярным выражением. Хотя вам не нужно избегать . в классе char.

EDIT:

Вы можете попробовать что-то вроде:

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

Для ввода имени и значения, где значение может иметь дополнительный знак.

...