8

pegjsを使用してパーサーを作成しようとしています。私は次のようなものを解析する必要があります:

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

"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("");
   }

pegjsでの繰り返しは貪欲であるため、ENDとSTARTには負の述語を使用する必要があります。

または、アクションは次のように記述できます。

{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 に答える