正则表达式中的括号似乎不适用于match / case语句。例如,以下代码
val pat1 = """ab""".r
val pat2 = """(a)(b)""".r
val pat3 = """((a)(b))""".r
val pat4 = """((a)b)""".r
val pat5 = """(ab)""".r
"ab" match {
case pat1(x) => println("1 " + x)
case pat2(x) => println("2 " + x)
case pat3(x) => println("3 " + x)
case pat4(x) => println("4 " + x)
case pat5(x) => println("5 " + x)
case _ => println("None of the above")
}
打印“5 ab”,但我希望任何模式都匹配。我想用“(...)?”可选元素,但我不能。与此相关,我不能(?m)工作。我的模式在匹配/案例表达式之外工作正常。有人可以向我解释Scala如何处理匹配/案例表达式中的正则表达式吗?
我正在尝试在Scala中编写一个tokenizer
答案 0 :(得分:8)
Regex
定义unapplySeq
,而非unapply
,这意味着您将每个组都放在自己的变量中。此外,虽然小写匹配器可能在某些情况下工作(即使用参数),但您确实应该使用大写。那么,将起作用的是:
val Pat1 = """ab""".r
val Pat2 = """(a)(b)""".r
val Pat3 = """((a)(b))""".r
val Pat4 = """((a)b)""".r
val Pat5 = """(ab)""".r
def no() { println("No match") }
"ab" match { case Pat1() => println("Pat1"); case _ => no }
"ab" match { case Pat2(x,y) => println("Pat2 "+x+" "+y); case _ => no }
"ab" match { case Pat3(x,y,z) => println("Pat3 "+x+" "+y+" "+z); case _ => no }
"ab" match { case Pat4(x,y) => println("Pat4 "+x+" "+y); case _ => no }
"ab" match { case Pat5(x) => println("Pat5 "+x); case _ => no }
(你将永远得到一个匹配。)
如果您想要所有比赛,请使用@ _*
"ab" match { case Pat3(w @ _*) => println(w); case _ => no }
我不确定(?a)
你的意思,所以我不知道它有什么问题。不要将(?a)
与(?:a)
(或(a?)
或(a)?
)混淆。
答案 1 :(得分:0)
以下是您如何访问每场比赛group(1)
的示例:
val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).matchData foreach {
m => println(m.group(1))
}
测试此演示 here 。