8

我正在尝试使用pegjs制作解析器。我需要解析类似的东西:

blah blah START Lorem ipsum 
dolor sit amet, consectetur 
adipiscing elit END foo bar 
etc.

我无法编写从 to 捕获文本的"START"规则"END"

4

1 回答 1

12

使用否定的前瞻谓词:

phrase
  =(!"START" .)* "START" result:(!"END" .)* "END" .* {
    for (var i=0;i<result.length;++i)
      // remove empty element added by predicate matching
      {result[i]=result[i][1];
      }
    return result.join("");
   }

您需要对 END 和 START 使用否定谓词,因为 pegjs 中的重复是贪婪的。

或者,动作可以写成

{return result.join("").split(',').join("");}

尽管这依赖于join在处理嵌套数组时没有必要记录的行为(即它用逗号连接子数组,然后将它们连接起来)。

[更新] 处理空元素的更短的方法是

phrase
  =(!"START" .)* "START" result:(t:(!"END" .){return t[1];})* "END" .* {
      return result.join("");
    }
于 2012-09-03T08:47:46.697 回答