【问题标题】:Scala Regex example not workingScala正则表达式示例不起作用
【发布时间】:2015-08-04 20:03:08
【问题描述】:

我是 scala 的新手,我正在尝试使用正则表达式来解决问题,但我遇到了一个错误。

我直接从文档 (2.10.4) 复制了一个示例,但我遇到了同样的错误。

我在这里错过了什么:

println(scala.tools.nsc.Properties.versionString)
val p1 = "ab*c".r
val p2 = "a(b*)c".r

val p1Matches = "abbbc" match {
  case p1() => true
  case _    => false
}

产生:

version 2.10.4
Exception in thread "main" java.lang.NoSuchMethodError:  scala.util.matching.Regex.unapplySeq(Ljava/lang/CharSequence;)Lscala/Option;
 at SparkGrep$.argsParser(SparkGrep.scala:67)
 at SparkGrep$.main(SparkGrep.scala:23)
 at SparkGrep.main(SparkGrep.scala)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
...

第 67 行是这样写的:

  case p1() => true

作为参考,此示例直接从 http://www.scala-lang.org/api/2.10.4/index.html#scala.util.matching.Regex 的 unappplyseq 示例复制

更新,我创建了一个示例项目,它确实有效。我发现这与我的构建过程有关,但我不知道为什么。

这是损坏项目的 build.sbt

name := "logdata-demo-07-22-2015"

version := "1.0"

scalaVersion := "2.10.4"

resolvers ++= Seq(
  "Typesafe Releases" at "http://repo.typesafe.com/ typesafe/releases",
  "spray repo" at "http://repo.spray.io"
)

resolvers += "spray" at "http://repo.spray.io/"

val sparkVersion = "1.3.0"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-mllib" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "com.databricks" %% "spark-csv" % "1.1.0",
  "com.github.scopt" %% "scopt" % "3.3.0"
)

assemblyMergeStrategy in assembly := {
  case m if m.toLowerCase.endsWith("manifest.mf")          => MergeStrategy.discard
  case m if m.toLowerCase.matches("meta-inf.*\\.sf$")      => MergeStrategy.discard
  case "log4j.properties"                                  => MergeStrategy.discard
  case m if m.toLowerCase.startsWith("meta-inf/services/") => MergeStrategy.filterDistinctLines
  case "reference.conf"                                    => MergeStrategy.concat
  case _                                                   => MergeStrategy.first
}

assemblyOutputPath in assembly := new File("output/logdata-demo.jar")

【问题讨论】:

  • 没有效果,问题似乎是在运行时没有提供签名的方法。
  • 为我返回 true,scala 2.11.6
  • @lostinplace 这可能与火花有关吗?也许他们提供了一个不太一样的正则表达式实现?

标签: regex scala


【解决方案1】:

我在 Scala 2.11.6 上尝试过,一切正常。 可以连接到 Scala 版本。

最好的做法是更新到2.11.x。如果你被2.10 卡住了,你可以试试2.10.5

scala> :paste
// Entering paste mode (ctrl-D to finish)

println(scala.tools.nsc.Properties.versionString)
val p1 = "ab*c".r
val p2 = "a(b*)c".r

val p1Matches = "abbbc" match {
  case p1() => true
  case _    => false
}

// Exiting paste mode, now interpreting.

version 2.11.6
p1: scala.util.matching.Regex = ab*c
p2: scala.util.matching.Regex = a(b*)c
p1Matches: Boolean = true

【讨论】:

  • 似乎不是印刷版的问题
【解决方案2】:

我在 Scala 2.10.4 中尝试了这段代码,它运行良好。

您应该尝试通过以下方式获取 Scala 版本,以确保您使用的是2.10.4

scala.util.Properties.scalaPropOrElse("version.number", "unknown")
  val p1 = "ab*c".r
  val p2 = "a(b*)c".r
  val p1Matches = "abbbc" match {
    case p1() => true
    case _    => false
  }

【讨论】:

  • 是的,我已经确认它应该可以工作......它只是没有,我不知道为什么
【解决方案3】:

这是由于类文件放置不当造成的。它们在构建时位于 scala 2.11 文件夹中。将它们移动到 scala-2.10 文件夹解决了这个问题。

SBT 很奇怪

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多