Reputation: 10629
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?
Upvotes: 16
Views: 8253
Reputation: 10629
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>
Upvotes: 26
Reputation: 454912
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.
Upvotes: 0