Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在正则表达式模式匹配中使用枚举_Scala - Fatal编程技术网

Scala 在正则表达式模式匹配中使用枚举

Scala 在正则表达式模式匹配中使用枚举,scala,Scala,我已经写了这个代码 object Foo extends Enumeration { val X = Value("X") val Y = Value("Y") } val regex = """([A-Z]+)(\d+)""".r val input = "ABC123" input match { case regex(x, num) if x == Foo.X.toString => // do something case regex(x, num) if x

我已经写了这个代码

object Foo extends Enumeration {
  val X = Value("X")
  val Y = Value("Y")
}

val regex = """([A-Z]+)(\d+)""".r
val input = "ABC123"

input match {
  case regex(x, num) if x == Foo.X.toString => // do something
  case regex(x, num) if x == Foo.Y.toString => // do something
  case _ => // throw error
}
这是可行的,但有点过于冗长。我试着把它改成

input match {
  case regex(`Foo.X.toString`, num) => // do something
  case regex(`Foo.Y.toString`, num) => // do something
  case _ => // throw error
}

但这并不适用于编译。这些“``特别适用于“VAL”,但不适用于枚举。

在我看来,似乎有人要求使用此功能,但大多数人现在都避免使用枚举:

scala> object E extends Enumeration {
     |   val X, Y = Value
     |   def unapply(s: String): Option[Value] = values.find(_.toString == s)
     | }
defined object E

scala> val r = "([A-Z]+)".r
r: scala.util.matching.Regex = ([A-Z]+)

scala> "Y" match { case r(E(e)) => e }
res0: E.Value = Y

scala> "Y" match { case r(E(E.Y)) => }
注意从任意字符串构造正则表达式的危险:

scala> object E extends Enumeration { val X, Y, Z_* = Value }
defined object E

scala> val r = E.values.mkString("|").r
r: scala.util.matching.Regex = X|Y|Z_$times

scala> object E extends Enumeration { val X, Y = Value ; val Z = Value("*") }
defined object E

scala> val r = E.values.mkString("|").r
java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 4
X|Y|*
    ^
  at java.util.regex.Pattern.error(Pattern.java:1955)
  at java.util.regex.Pattern.sequence(Pattern.java:2123)
  at java.util.regex.Pattern.expr(Pattern.java:1996)
  at java.util.regex.Pattern.compile(Pattern.java:1696)
  at java.util.regex.Pattern.<init>(Pattern.java:1351)
  at java.util.regex.Pattern.compile(Pattern.java:1028)
  at scala.util.matching.Regex.<init>(Regex.scala:209)
  at scala.collection.immutable.StringLike.r(StringLike.scala:287)
  at scala.collection.immutable.StringLike.r$(StringLike.scala:287)
  at scala.collection.immutable.StringOps.r(StringOps.scala:29)
  at scala.collection.immutable.StringLike.r(StringLike.scala:276)
  at scala.collection.immutable.StringLike.r$(StringLike.scala:276)
  at scala.collection.immutable.StringOps.r(StringOps.scala:29)
  ... 29 elided

scala> object E extends Enumeration { val X, Y = Value ; val Z = Value(".*") }
defined object E

scala> val r = E.values.mkString("|").r
r: scala.util.matching.Regex = X|Y|.*

scala> "junk" match { case r() => }
scala>objecte扩展枚举{valx,Y,Z.*=Value}
定义对象E
scala>val r=E.values.mkString(“|”).r
r:scala.util.matching.Regex=X | Y | Z|$times
scala>对象E扩展枚举{val X,Y=Value;val Z=Value(“*”)}
定义对象E
scala>val r=E.values.mkString(“|”).r
java.util.regex.PatternSyntaxException:在索引4附近悬挂元字符“*”
X | Y|*
^
位于java.util.regex.Pattern.error(Pattern.java:1955)
位于java.util.regex.Pattern.sequence(Pattern.java:2123)
位于java.util.regex.Pattern.expr(Pattern.java:1996)
位于java.util.regex.Pattern.compile(Pattern.java:1696)
Pattern.(Pattern.java:1351)
位于java.util.regex.Pattern.compile(Pattern.java:1028)
位于scala.util.matching.Regex。(Regex.scala:209)
在scala.collection.immutable.StringLike.r(StringLike.scala:287)
位于scala.collection.immutable.StringLike.r$(StringLike.scala:287)
位于scala.collection.immutable.StringOps.r(StringOps.scala:29)
在scala.collection.immutable.StringLike.r(StringLike.scala:276)
位于scala.collection.immutable.StringLike.r$(StringLike.scala:276)
位于scala.collection.immutable.StringOps.r(StringOps.scala:29)
... 29删去
scala>object E扩展了枚举{val X,Y=Value;val Z=Value(“.*”)}
定义对象E
scala>val r=E.values.mkString(“|”).r
r:scala.util.matching.Regex=X | Y |*
scala>“垃圾”匹配{case r()=>}