我的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)
有人能找到我出错的地方吗?
答案 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\((.*?)\)"""
。