1

我有一个处理逗号分隔的十进制数列表的 Scala 组合器解析器。

object NumberListParser extends RegexParsers {
  def number: Parser[Double] = """\d+(\.\d*)?""".r ^^ (_.toDouble)

  def numbers: Parser[List[Double]] = rep1sep(number, ",")

  def itMatches(s: String): Boolean = parseAll(numbers, s) match {
    case _: Success[_] => true
    case _ => false
  }
}

当给定与模式匹配的字符串时,该itMatches函数返回。true例如:

NumberListParser.itMatches("12.4,3.141") // returns true
NumberListParser.itMatches("bogus") // returns false

有没有更简洁的方法来做到这一点?我在文档中找不到,但我的函数看起来有点冗长,所以我想知道我是否忽略了一些东西。

4

3 回答 3

3

您可以使用JavaTokenParsers并从中受益decimalNumbers

object NumberListParser extends JavaTokenParsers {
  def number: Parser[Double] = decimalNumbers ^^ (_.toDouble)
  def numbers: Parser[List[Double]] = rep1sep(number, ",")
  def itMatches(s: String): Boolean = parseAll(numbers, s) match {
    case _: Success[_] => true
    case _ => false
  }
}
于 2012-12-13T05:38:23.283 回答
3

我想我应该添加我的评论作为答案,因为它就是答案。您可以使用专门为此目的设计的successfulon 方法:ParseResult

import scala.util.parsing.combinator._

object NumberListParser extends RegexParsers {
  def number = """\d+(\.\d*)?""".r ^^ (_.toDouble)
  def numbers = rep1sep(number, ",")

  def itMatches(s: String): Boolean = parseAll(numbers, s).successful
}

这给出了与您的实现完全相同的行为。

于 2012-12-13T17:37:49.507 回答
1

你可以itMatches这样定义:

def itMatches(s: String): Boolean = parseAll(numbers, s).map{ r => true }.getOrElse(false)

你不需要解析器。Regex足够:

var R = """\d+(\.\d*)?(,\d+(\.\d*)?)*""".r
def itMatches(s: String) = s match {
  case R(_*) => true
  case _ => false
}

scala> itMatches("12.4,3.141")
res0: Boolean = true

scala> itMatches("bogus")
res1: Boolean = false
于 2012-12-13T05:54:57.617 回答