如何使用 scala 组合器匹配句子中的所有单词



对于使用scala组合器的第一个测试,我试图从句子中获取所有单词,但我只是从以下代码中得到"None":

import java.io.File
import scala.io.Source
import scala.util.parsing.combinator._
object PgnReader extends TagParser {
  def parseFile(inputFile:File) = {
    val pgnStream = Source.fromFile(inputFile)
    val pgnStr = pgnStream.mkString
    println(parseAll(tag, "Hello World !").getOrElse("None"))
    pgnStream.close
  }
}
trait TagParser extends RegexParsers {
  val tag:Parser[String] = """[:alpha:]+""".r ^^ (_.toString)
}

我想得到类似的东西:

Hello
World

甚至像:

List(Hello, World)

我的代码是否正确?

我正在使用 scala 2.11 和 scala 组合器

你应该使用类似的东西来匹配令牌序列而不是一个令牌:

trait TagParser extends RegexParsers {
  val tags: Parser[List[String]] = rep("""[a-zA-Z]+""".r)
}

rep是:

用于重复的解析器生成器。

rep(p) 反复使用 p 来解析输入,直到 p 失败(结果 是 p 的连续结果的列表)。

http://www.scala-lang.org/files/archive/nightly/docs/parser-combinators/index.html#scala.util.parsing.combinator.RegexParsers

我认为

这可能会让你更接近:

trait TagParser extends RegexParsers {
  val tag = rep("""p{Alpha}+""".r) ^^ (_.map(_.toString))
}

POSIX 字符类在 Scala 中具有不同的语法(继承自 Java)。 rep()语法允许多次出现(给出List())。

这仍然会在感叹号上窒息,因此您可以稍微增加您的正则表达式。 我可能还会分别使用"标签"和"标签"的概念,以使事情更清楚:

trait TagParser extends RegexParsers {
  val tags = rep(tag)
  val tag = """p{Alpha}+|!""".r ^^ (_.toString)
}
...
println(parseAll(tags, "Hello World !").getOrElse(None))
...

最新更新