5

Scala パーサー コンビネーターとの一致を反転することは可能ですか? 一連のキーワードで始まらない行をパーサーと一致させようとしています。これは、煩わしいゼロ幅の負の先読み正規表現 (例: "(?!h1|h2).*") で行うこともできますが、Scala パーサーで行うほうがよいでしょう。私が思いついた最高のものはこれです:

def keyword = "h1." | "h2."
def alwaysfails = "(?=a)b".r
def linenotstartingwithkeyword = keyword ~! alwaysfails | ".*".r

使うアイデアはこちら~!すべて一致する正規表現へのバックトラックを禁止してから、何も一致しない正規表現 "(?=a)b".r を続行します。(ちなみに、常に失敗する事前定義されたパーサーはありますか?) そうすれば、キーワードが見つかった場合は行が一致しませんが、キーワードが一致しない場合は一致します。

これを行うためのより良い方法があるかどうか疑問に思っています。ある?

4

1 に答える 1

7

ここで使用できnotます:

import scala.util.parsing.combinator._

object MyParser extends RegexParsers {
  val keyword = "h1." | "h2."
  val lineNotStartingWithKeyword = not(keyword) ~> ".*".r

  def apply(s: String) = parseAll(lineNotStartingWithKeyword, s)
}

今:

scala> MyParser("h1. test")
res0: MyParser.ParseResult[String] = 
[1.1] failure: Expected failure

h1. test
^

scala> MyParser("h1 test")
res1: MyParser.ParseResult[String] = [1.8] parsed: h1 test

failureon にもメソッドがあることに注意してParsersくださいkeyword ~! failure("keyword!")。とにかくnot、ずっといいです。

于 2012-10-31T22:08:14.043 に答える