2016-04-11 5 views
1

をスローIは{キー} = {値}複数回繰り返すと一致単純RegexParserを有しますそれにもかかわらず、正規表現はそれを制限しない)。私は、「トークン= ABCは再び= ABC」にマッチしようとしたとき、私は次のエラーを持っている:スカラ正規表現パーサーは奇妙なエラー

[1.11] failure: string matching regex `\z' expected but `a' found 

token=abc again=abc' 
     ^

RegexParserは、このような奇妙な行動を持っているのはなぜ?

答えて

1

あなたの予期しない動作が非常に簡単です、ちょうどskipWhitespaceの値変更のための修正:RegexParsersの説明から

object CommandOptionsParser extends RegexParsers { 
    override val skipWhitespace = false 

を:

The parsing methods call the method skipWhitespace (defaults to true) and, if true, skip any whitespace before each parser is called.

だから、何が起こった、あなたの最初のpairがマッチしましたwhiteSpaceがスキップされ、repsepが別の空白区切り文字を見つけることができなかったため、解析が終了したと仮定しただけで、 "\ z"が期待されていました。

また、このような単純な作業のためのParserのアプローチ全体が複雑すぎるように見えますが、単純な正規表現で十分です。


UPD:また、あなたのパーサーは少し単純になります

val pair: Parser[Option[(String, Option[String])]] = 
    (key ~ ("=" ~> value).?).? ^^ (_.map {case (k ~ v) => k.trim -> v.map(_.trim)}) 

    val pairs: Parser[Map[String, Option[String]]] = phrase(repsep(pair, whiteSpace)) ^^ 
    { l => Map(l.flatten: _*)}