使用regex的Scala捕获组
假设我有以下代码:使用regex的Scala捕获组,regex,string,scala,capturing-group,Regex,String,Scala,Capturing Group,假设我有以下代码: 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 p
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 您想查看组(1)
,您当前正在查看组(0)
,即“整个匹配字符串”
请参阅。以下是如何访问每个匹配的
组(1)
的示例:
val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).matchData foreach {
m => println(m.group(1))
}
这将打印“483”
()
环顾选项 根据模式的复杂性,还可以使用lookarounds仅匹配所需的部分。它看起来像这样:
val string = "one493two483three"
val pattern = """(?<=two)\d+(?=three)""".r
pattern.findAllIn(string).foreach(println)
val string=“one493two483three”
val pattern=“”(?启动Scala 2.13
,作为正则表达式解决方案的替代方案,还可以通过以下方式对字符串进行模式匹配:
甚至:
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"
你能举例说明我提供的输入吗?我试图调用findAllIn返回的group(1)
,但我得到了一个非法状态异常。这是迄今为止最简单的方法。你使用regex对象(“模式”)在匹配/案例中,并将组提取到变量a483中。这种情况下的问题是模式两侧都应该有通配符:val pattern=“”*“两(\d+)三。*”“.rYes.我不认为上面的内容马上就清楚了,但是一旦你理解了它将数字匹配组分配给变量'a483',那么它就更有意义了。也许可以以更清晰的方式重写?这是使用正则表达式的scala方式。对于不理解这个答案背后的魔力的人,请尝试搜索“scala正则表达式提取器”或“scala unapply regex”等。语义不清楚。这是字符串的第一个、最后一个还是随机匹配?您也可以使用pattern.findAllMatchIn(string).foreach…
"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"