我正在尝试使用pegjs制作解析器。我需要解析类似的东西:
blah blah START Lorem ipsum
dolor sit amet, consectetur
adipiscing elit END foo bar
etc.
我无法编写规则来捕捉"START"
到"END"
的文字。
答案 0 :(得分:10)
使用否定前瞻谓词:
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("");
}