斯卡拉捕获组使用正则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式教程 。