使用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"