2014-07-24 67 views
0
val a="""\s*(abc)?.*(xyz)?""".r 
val a(x,y)=" abcxyz" 

我期待y是xyz,但實際上它是空的,我怎麼能提取xyz?它是可選的,但如果它在那裏,我想提取它。正則表達式問題,也許與貪婪匹配有關

scala> val a="""\s*(abc)?.*(xyz)?""".r 
a: scala.util.matching.Regex = \s*(abc)?.*(xyz)? 

scala> val a(x,y)=" abcxyz" 
x: String = abc 
y: String = null 
+1

嘗試'「」「\ s *(abc)?。*?(xyz)?」「」。r' –

回答

2

問題是「。*」。

它在達到「(xyz)」之前消耗整個匹配。

您可以添加「?」到Kleene-Star爲了使比賽不貪婪「。*?」。

val a="""\s*(abc)?.*?(xyz)?""".r 
//a: scala.util.matching.Regex = \s*(abc)?.*?(xyz)? 

val a(x,y)=" abcxyz" 
//x: String = abc 
//y: String = xyz