如何测试Scala combinator解析器是否匹配字符串

如何测试Scala combinator解析器是否匹配字符串,scala,parser-combinators,Scala,Parser Combinators,我有一个Scala combinator解析器,它处理逗号分隔的十进制数字列表 object NumberListParser extends RegexParsers { def number: Parser[Double] = """\d+(\.\d*)?""".r ^^ (_.toDouble) def numbers: Parser[List[Double]] = rep1sep(number, ",") def itMatches(s: String): Boolean

我有一个Scala combinator解析器,它处理逗号分隔的十进制数字列表

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
有没有更简洁的方法?我在文档中找不到一个,但是我的函数有点冗长,所以我想知道我是否忽略了什么。

您可以使用小数并从中受益

您可以使用小数并从中受益

您可以将itMatches定义为:

您不需要解析器。正则表达式就足够了:

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
您可以将itMatches定义为:

您不需要解析器。正则表达式就足够了:

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

我想我应该加上我的评论作为答案,因为这就是答案。您可以在上使用成功的方法,该方法正是为此目的而设计的:

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
}

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

我想我应该添加我的注释作为答案,因为它就是答案。您可以在上使用成功的方法,该方法正是为此目的而设计的:

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
}
这将提供与您的实现完全相同的行为。

这正是目的所在。这正是目的所在。