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

Extracting inner group with Scala regex

我的 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)

谁能看出我哪里出错了?

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

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

您可以在 .*? 周围使用一个捕获组,并在 match 块中使用一个未锚定的正则表达式,这样模式可以保持简短并且 "pretty"(不需要 .* 围绕您要查找的值):

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\((.*?)\)""".