2016-10-25 19 views
0

我的Scala應用程序正在被賦予一個字符串,其中可能包含或不包含標記「flimFlam(*)」,其中星號代表任何類型的文本,字符,標點符號等。在此字符串中只有0或1個「flimFlam(*)」實例,從未更多。使用Scala正則表達式提取內部組

我需要檢測給定的輸入字符串是否包含「flimFlam(*)」實例,如果有,請提取出兩個括號內的內容。因此,如果我的字符串包含「flimFlam(Joe)」,那麼結果將是與「Joe」一個值的字符串,等等

我迄今爲止最好的嘗試:

val inputStr : String = "blah blah flimFlam(Joe) blah blah" 

// Regex must be case-sensitive for "flimFlam" (not "FLIMFLAM", "flimflam", etc.) 
val flimFlamRegex = ".*flimFlam\\(.*?\\)".r 
val insideTheParens = flimFlamRegex.findFirstIn(inputStr) 

人那個地方我會出錯?

回答

2

使用模式匹配和正則表達式提取

val regex = ".*flimFlam\\((.*)\\).*".r 

inputStr match { 
case regex(x) => println(x) 
case _ => println("no match") 
} 

斯卡拉REPL

scala> val inputStr : String = "blah blah flimFlam(Joe) blah blah" 
inputStr: String = blah blah flimFlam(Joe) blah blah 

scala> val regex = ".*flimFlam\\((.*)\\).*" 
regex: String = .*flimFlam\((.*)\).* 

scala> val regex = ".*flimFlam\\((.*)\\).*".r 
regex: scala.util.matching.Regex = .*flimFlam\((.*)\).* 

scala> inputStr match { case regex(x) => println(x); case _ => println("no match")} 
Joe 
+0

unanchored在其他答案是方便知道(和促進)。 –

0

您可以使用周圍.*?捕獲組,只需使用match塊中的非錨定的正則表達式,這樣的模式可能保持簡短和「漂亮」(不需要.*左右的值你正在尋找):

var str = "blah blah flimFlam(Joe) blah blah" 
val pattern = """flimFlam\((.*?)\)""".r.unanchored 
val res = str match { 
    case pattern(res) => println(res) 
    case _ => "No match" 
} 

online demo

另外請注意,您不需要內部""" -quoted字符串字面量,有助於避免過度反斜槓反斜槓加倍。

而且一個提示:如果flimFlam整個單詞,在前面加\b - """\bflimFlam\((.*?)\)"""