2010-03-17 78 views
10

我想匹配在斯卡拉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> 

但是,這是行不通的。匹配可選正則表達式組的正確方法是什麼?

回答

17

可選組將是空,如果不匹配,所以你需要在模式匹配包括「空」:

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在Regex.unapplySeq中使用Matcher.group方法。這指定如果某個組未能匹配部分序列,則返回null - 2010-03-17 12:25:15

+2

這將是很好,如果斯卡拉可以使用一個可選的正則表達式字段選項類,而不是要求空檢查。 – 2014-11-07 11:24:16

0

我沒有看到你的正則表達式的任何問題。儘管您不需要在char類中轉義.

編輯:

你可以嘗試這樣的:

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

捕捉到貨物的價值可以有一個可選的符號的名稱和值。

+0

@codaddict感謝指出了這一點;)的正則表達式是好的,問題是我無法看到誰使用Scala模式匹配系統匹配可選組。我可以在網上找到沒有例子這樣做 – 2010-03-17 10:43:18

+0

@codaaddict謝謝,這將讓我的代碼工作,但斯卡拉模式匹配問題仍然存在:)我實際上需要不同的XML根據是否有或不是符號,所以使用模式匹配系統來提取和測試是否有跡象似乎是對我來說最乾淨的解決方案 – 2010-03-17 11:04:47