I'm trying to match on an option group in Scala 2.8 (beta 1) with the following code:
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>
But this is not working. What is the correct way to match optional regex groups?
The optional group will be null if it is not matched so you need to include "null" in the pattern match:
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>
I don't see any problem with your regex. Although you need not escape the .
in the char class.
EDIT:
You can try something like:
([\w.]+)\s*:\s*((?:+|-)?\d+)
To capture the name and value where the value can have an optional sign.
精彩评论