使用Scala正则表达式提取内部组

时间:2016-10-25 14:36:38

标签: regex scala regex-group

我的Scala应用程序被赋予一个字符串,该字符串可能包含或不包含其中的标记“flimFlam(*)”,其中星号表示任何类型的文本,字符,标点符号等。总是只有此字符串中有0或1个“flimFlam(*)”实例,绝不会更多。

我需要检测给定的输入字符串是否包含“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 个答案:

答案 0 :(得分:2)

使用模式匹配和正则表达式提取器

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

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

Scala 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

答案 1 :(得分: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

另外,请注意,您不需要在"""内添加反斜杠 - 引用的字符串文字有助于避免过多的反斜杠。

并提示:如果flimFlam整个单词,请在前面添加\b - """\bflimFlam\((.*?)\)"""