1

コンマ区切りの 10 進数のリストを処理する 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

それが答えなので、コメントを答えとして追加する必要があると思います。まさにこの目的のために設計されたsuccessfulメソッド onを使用できます。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 に答える