假设我有这段代码:
val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).foreach(println)
我希望findAllIn
仅返回483
,而是返回two483three
。我知道我可以使用unapply
仅提取该部分,但我必须为整个字符串设置一个模式,例如:
val pattern = """one.*two(\d+)three""".r
val pattern(aMatch) = string
println(aMatch) // prints 483
有没有其他方法可以实现这一点,而不直接使用java.util
中的类,而不使用unapply?
答案 0 :(得分:88)
以下是您如何访问每场比赛group(1)
的示例:
val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).matchData foreach {
m => println(m.group(1))
}
这会打印"483"
(as seen on ideone.com)。
根据模式的复杂程度,您还可以使用仅匹配所需部分的外观。它看起来像这样:
val string = "one493two483three"
val pattern = """(?<=two)\d+(?=three)""".r
pattern.findAllIn(string).foreach(println)
以上内容还会打印"483"
(as seen on ideone.com)。
答案 1 :(得分:28)
val string = "one493two483three"
val pattern = """.*two(\d+)three.*""".r
string match {
case pattern(a483) => println(a483) //matched group(1) assigned to variable a483
case _ => // no match
}
答案 2 :(得分:13)
您想查看group(1)
,您当前正在查看group(0)
,这是“整个匹配的字符串”。
答案 3 :(得分:1)
def extractFileNameFromHttpFilePathExpression(expr: String) = {
//define regex
val regex = "http4.*\\/(\\w+.(xlsx|xls|zip))$".r
// findFirstMatchIn/findAllMatchIn returns Option[Match] and Match has methods to access capture groups.
regex.findFirstMatchIn(expr) match {
case Some(i) => i.group(1)
case None => "regex_error"
}
}
extractFileNameFromHttpFilePathExpression(
"http4://testing.bbmkl.com/document/sth1234.zip")
答案 4 :(得分:0)
从Scala 2.13
开始,作为正则表达式解决方案的替代方案,还可以通过unapplying a string interpolator模式匹配String
:
"one493two483three" match { case s"${x}two${y}three" => y }
// String = "483"
甚至:
val s"${x}two${y}three" = "one493two483three"
// x: String = one493
// y: String = 483
如果您期望输入不匹配,则可以添加默认的模式防护:
"one493deux483three" match {
case s"${x}two${y}three" => y
case _ => "no match"
}
// String = "no match"