2012-10-31 3 views
5

Scala 파서 결합 자와 일치하는 것을 반전시킬 수 있습니까? 이 아닌 파서와 행을 일치 시키려고 노력 중입니다.은 일련의 키워드로 시작합니다. 짜증나는 제로 너비의 룩어 헤드 정규 표현식 (예 : "(?!h1|h2).*")으로이 작업을 수행 할 수 있지만 스칼라 파서로 처리하는 것이 좋습니다. 내가 생각해 낼 수 있었던 가장 좋은 점은 다음과 같습니다.스칼라 파서 - 결합 자 : 어떻게 일치를 뒤집을 수 있습니까?

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

아이디어는 여기에서 ~를 사용합니다! all-matching regexp로 되돌아가는 것을 금지하고, 정규 표현식 "(? = a) b".r을 계속해서 사용합니다. (그런데 미리 정의 된 파서가 항상 실패합니까?) 그런 식으로 키워드가 발견되면 줄은 일치하지 않지만 키워드가 일치하지 않으면 줄은 일치합니다.

더 좋은 방법이 있는지 궁금합니다. 거기 있니?

답변

6

현재 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) 
} 

: 당신은 단지뿐만 아니라 keyword ~! failure("keyword!")과 버전을 작성했습니다 수 있도록, 또한 Parsersfailure 방법이 있음을

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 

참고. 하지만 어쨌든 not은 훨씬 좋네요.

관련 문제