我正在尝试使用pegjs进行解析器。我需要解析如下内容:

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

我很难编写规则来捕获从"START""END"的文本。

最佳答案

使用否定的超前谓词:

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中的重复是贪婪的。

另外, Action 可以写成
{return result.join("").split(',').join("");}

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

[更新]处理空元素的一种较短方法是
phrase
  =(!"START" .)* "START" result:(t:(!"END" .){return t[1];})* "END" .* {
      return result.join("");
    }

10-04 16:08
查看更多