0

紛らわしいタイトルで申し訳ありませんが、どのように説明すればよいかわかりません。

カスタム スクリプト言語を解析する必要がある学校のプロジェクト用に、単純な Web サーバーを構築しています。次のような行があります。

<p>Here's the date: <% pr date() %></p><p>Here's the date again: <% pr date() %></p>

次の正規表現を使用して、 <% ... %> のものを抽出しようとしています...

<% *(.*) *%>

問題は、最初の開始タグから最初の終了タグまでではなく、最初の開始タグから最後の終了タグまで一致していることです。したがって、結果の一致は次のようになります。

<% pr date() %></p><p>Here's the date again: <% pr date() %>

...それ以外の:

<% pr date() %>

私はこのようなものを使用してそれを解決できると思っていましたが、うまくいかないようです:

<% *([^(<%)]*) *%>

...しかし、うまくいかないようです。どんな助けでも大歓迎です、ありがとう。

4

2 に答える 2

2

問題は、最初の開始タグから最後の終了タグまで一致していることです

最初に一致が認識されたときに停止する貪欲でない一致が必要です。

.*  --> greedy ("maximum munch")
.*? --> non-greedy ("minimal munch")

もちろん、貪欲でない量指定子は、他のほとんどのパターンに適用できます。

ただし、正規表現を使用しないことをお勧めします。メタパターンOPEN-TOKEN CONTENT CLOSE-TOKENは、手書きのパーサー/スキャナーにとって十分に単純です。これにより、タグがコメント内にある場合も簡単に認識できます (一致させたくない場合は他のケースも考えられます)。

<!-- <% xyz %> -->

上記のようなコードは推奨されないかもしれませんが、それを考慮する必要があります。


脚注:いつでも(write a parser|fire a regular expression)、あなたはすでに片足で刑務所にいます。

于 2012-11-08T17:07:25.897 に答える
1

.*貪欲な量指定子を使用しています

which is a lazy quantifier の.*?代わりに使用.*

つまり、正規表現を使用します<%(.*?)%>


したがって、最後<%(.*)%>まで一致します %>

<%(.*?)%>最初 %>に見つかったものまで一致します

于 2012-11-08T17:08:10.743 に答える