斯卡拉捕获组使用正则expression式

比方说,我有这个代码:

val string = "one493two483three" val pattern = """two(\d+)three""".r pattern.findAllIn(string).foreach(println) 

我预计findAllIn只返回483 ,而是返回两个483 two483three 。 我知道我可以使用unapply来只提取部分,但我必须有一个整个string的模式,像这样:

  val pattern = """one.*two(\d+)three""".r val pattern(aMatch) = string println(aMatch) // prints 483 

有没有其他的方式来实现这一点,而不直接使用java.util的类,而不使用unapply?

下面是一个如何访问每个比赛的group(1)的例子:

 val string = "one493two483three" val pattern = """two(\d+)three""".r pattern.findAllIn(string).matchData foreach { m => println(m.group(1)) } 

这将打印"483" ( 如在ideone.com上所见 )。


查找选项

根据模式的复杂程度,还可以使用lookaround来匹配所需的部分。 它看起来像这样:

 val string = "one493two483three" val pattern = """(?<=two)\d+(?=three)""".r pattern.findAllIn(string).foreach(println) 

上面也打印"483" ( 如在ideone.com上所见 )。

参考

  • regular-expressions.info/Lookarounds
 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 } 

你想看看group(1) ,你正在看group(0) ,这是“整个匹配的string”。

看到这个正则expression式教程 。