Я пытаюсь соответствовать на группе опции в (бете 1) Scala 2.8 со следующим кодом:
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>
Но это не работает. Что корректный путь состоит в том, чтобы соответствовать дополнительным regex группам?
Необязательная группа будет иметь значение null, если она не найдена, поэтому вам нужно включить "null" в сопоставление с образцом:
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>
Я не вижу никаких проблем с вашим regex. Хотя вам не нужно экранировать .
в классе char.
EDIT:
Вы можете попробовать что-то вроде:
([\w.]+)\s*:\s*((?:+|-)?\d+)
Чтобы перехватить имя и значение, где значение может иметь необязательный знак.