regex - 带括号的组在 Scala 中有效吗?

标签 regex scala

正则表达式中的括号在 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 如何处理 match/case 表达式中的正则表达式吗?

我正在尝试在 Scala 中编写一个标记器

最佳答案

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)? )。

关于regex - 带括号的组在 Scala 中有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13483292/

相关文章:

regex - 正则表达式使用Dart lang

正则表达式删除所有内容,但从 R 中的字符串中删除表情符号?

scala - 如何从scala中的子类调用父类(super class)构造函数以及如何进行构造函数链接

scala - bool Scala/Chisel 的选项方法

Scala 保护对象

macos - 使用 sbt 0.11.0 安装 Scala 2.9.1/Lift 2.4-M4

java - 正则表达式,从 HTML 中提取具有特殊名称的 href 属性

regex - 批处理 : how to split string on uppercase letter

Python。替换 html 标签之间的文本

scala - 理解 Scala : passing functions as arguments