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("");
}
pegjsでの繰り返しは貪欲であるため、ENDとSTARTには負の述語を使用する必要があります。
または、アクションは次のように記述できます。
{return result.join("").split(',').join("");}
これは、ネストされた配列を処理するときの、必ずしも文書化されていない動作に依存していjoin
ます(つまり、サブ配列をコンマで結合してから連結します)。
[更新]空の要素を処理するためのより短い方法は
phrase
=(!"START" .)* "START" result:(t:(!"END" .){return t[1];})* "END" .* {
return result.join("");
}