如何测试Scala combinator解析器是否匹配字符串
我有一个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
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
}
这将提供与您的实现完全相同的行为。这正是目的所在。这正是目的所在。