使用 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"
}
此外,请注意,您不需要在 """
引用的字符串文字中使用双反斜杠,这有助于避免过多的反斜杠。
还有一个提示:如果flimFlam
是一个全字,在前面加上\b
- """\bflimFlam\((.*?)\)"""
.
我的 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"
}
此外,请注意,您不需要在 """
引用的字符串文字中使用双反斜杠,这有助于避免过多的反斜杠。
还有一个提示:如果flimFlam
是一个全字,在前面加上\b
- """\bflimFlam\((.*?)\)"""
.